Verilog数据流建模与高密度脂蛋白导入
使用进口高密度脂蛋白synthesizable HDL代码导入仿真软件万博1manbetx®建模环境。导入HDL代码,使用importhdl
函数。确保使用的结构是由高密度脂蛋白HDL代码导入。万博1manbetx
这些表支持的Verilog列表万博1manbetx®高密度脂蛋白数据流模式时,您可以使用导入HDL代码。如果您的代码使用了一个不受支持的数据流模型,如万博1manbetx推断一个门闩的代码,importhdl
生成一个错误消息链接到文件名和行号。然后您可以更新代码前面的例子。
万博1manbetx支持Verilog数据流模式
Verilog数据流模型 | Verilog代码示例 |
---|---|
阻塞赋值的顺序总是阻塞和非阻塞赋值组合总是。 |
例如,这个Verilog代码使用一个顺序赋值的变量 模块dataconv (clk, a, b, c);输入时钟;整数我;输入导线(7:0)a、b;输出线[7:0]c;reg 1:0[]临时(0:7);总是@(*)开始(我= 0;< = 7;我= + 1)开始临时[我]< = a[我]+[我];结束结束分配c = temp;endmodule |
多个分配给相同的信号。您可以使用部分信号和完成作业。 |
这个例子显示了Verilog代码执行部分的任务和完成任务的变量 模块testPartialAndCompleteAssign(输入(2:0)in1 in2,输入电导率、clk,输出(2:0)着干活);reg [2:0] out1_reg;always@ (posedge clk)开始如果(电导率)开始out1_reg [0] = 1 'b0;out1_reg [1] = 1 'b0;out1_reg [2] = 1 'b0;其他结束开始out_reg = in1 & in2;结束结束分配着干活= out1_reg;endmodule |
多个分配到同一个变量的真或假的路径开关块,推断。 |
例如,这个Verilog代码执行多个任务到变量 模块testSwitchMuxing(输入2:0三机一体,气孔导度,输出reg[2:0]着干活);always@(*)开始如果(电导率)开始着干活=三机一体;其他结束开始着干活= 3 'd2;着干活= 3 'd1;结束结束endmodule |
选择,选择一部分,数组索引操作信号。一个多端口切换是推断,当数组索引RHS执行。数组索引操作lh是作为推断出来的分配块。 | 例如,这个Verilog代码使用多个作业的变量 模块ArrayIndexing(三机一体、In2 In3、In4 Sel1, Sel2,着干活,Out2, Out3);参数w = 7;输入(w: 0)三机一体、In2 In3, In4;输入(1:0]Sel1 Sel2;输出(w: 0]着干活;输出(1:0]Out2;输出Out3;线(w: 0) v(握);分配v[0] =三机一体;分配v [1] = In2; assign v[2] = In3; assign v[3] = In4; //Array indexing with signal Sel1 assign Out1 = v[Sel1]; //Part select on array index with signal Sel2 assign Out2 = v[Sel2][7:2]; //Bit select on array index with signal Sel assign Out3 = v[Sel2][4]; endmodule |
不支万博1manbetx持的Verilog数据流模式
这些数据流结构不支持当你导入Verilog代码。万博1manbetx的描述和示例场景列描述每个场景用一个例子,演示如何避免这种情况。
Verilog数据流模型 | 描述和示例场景 |
---|---|
插销检测从Verilog代码。 |
存在的门闩HDL代码可以导致生成的仿真软件模型和代数循环导致模型编译失败。万博1manbetx为了避免闩推理,指定所有在if - else条件和分支语句。 例如,当您导入这个Verilog代码,if条件推断的开关块。块有一个真正的在代码中指定的路径。的输出开关块是反馈直接作为输入错误的路径导致一个代数循环。 模块testAlgebraicLoop(输入条件数、输入(2:0)in1输出reg[2:0]着干活);/ /原因门闩推理——支持always@(*)开始如果(电导万博1manbetx率)开始着干活=三机一体;结束结束/ /指定其他分支,以避免闩推理/ / always@(*)开始/ /如果(电导率)开始/ /着干活=三机一体;/ /结束/ /其他/ /开始着干活= in1 + 1;/ /结束/ / endmodule结束 |
执行操作时钟、复位或时钟使信号在Verilog代码。 | 当你使用的名字,如定义信号 例如,Verilog代码使用一个显式赋值与时钟信号 模块testOperationOnClkBundle(输入2:0三机一体,输入时钟输出reg 2:0着干活,输出out2);reg [2:0] out1_reg;always@ (posedge clk)开始out1_reg < =三机一体;最终分配out2 = clk & & 1 'b1;endmodule 确保你的Verilog代码不执行任何操作的信号时钟包。此外,对于信号,你用在代码中执行计算,确保信号名称不匹配的任何名称,推断为时钟,重置,或使信号。看到 |
时钟和复位信号的敏感性不同的时钟边沿或不同的重置相同模块内部的边缘。 |
你不能有一个 例如,这个Verilog代码使用的积极和消极的边缘相同的时钟,也不支持。万博1manbetx 模块testMultipleClockEdges(输入(2:0)in1 in2,输入时钟输出(2:0)着干活,out2);reg 2:0 out1_reg, out2_reg;/ * clk posedge敏感性* / always@ (posedge clk)开始out1_reg < = in1 & & in2;结束/ * clk neegedge敏感性* / always@ (negedge clk)开始out2_reg < = in1 | | in2;最终分配着干活= out1_reg;分配out2 = out2_reg;endmodule 确保你的Verilog代码不使用时钟的两条边或复位信号在同一模块。使用 |
实现同步和异步电路在相同模块。 |
你不能用Verilog代码实现电路在同一模块,如以下代码所示。用不同的模块实现的异步和同步电路。 模块testSynchronousAsynchronous(输入(2:0)in1 in2,输入时钟、复位,输出(2:0)着干活,out2);reg 2:0 out1_reg, out2_reg;/ *总是同步块* / always@ (posedge clk)开始out1_reg < = in1 & & in2;/ *异步总是块* /结束always@ (posedge clk或posedge重置)开始out2_reg < = in1 | | in2;最终分配着干活= out1_reg;分配out2 = out2_reg;endmodule |
初始化多个公羊的推断在同一个模块。 |
例如,这个推断Verilog代码 模块testMultipleRAMs(输入(2:0)in1 in2,输入时钟、复位,输出reg 2:0 read_data0, read_data1);reg 2:0 out1_reg, out2_reg;/ *推理的RAM sample_store0 * / always@ (posedge clk)开始如果(write_enable)开始sample_store0 (write_address) < = write_data;结束read_data0 = sample_store0 [read_address0] / *推理的RAM sample_store1 * /结束always@ (posedge clk)开始如果(write_enable)开始sample_store1 (write_address) < = write_data;结束read_data1 = sample_store0 read_address1 endmodule结束 |
使用某些构造阅读从一个初始值 |
一个 例如,这个Verilog代码使用一个if - else条件赋值的变量 模块testInitial(输入条件数,输入(握)write_data输出注册(握)dout_a dout_b, doutc);参数AddrWidth = 3;整数我;注册(握)ram (7:0);最初的开始(i = 0;我< = 2 * * AddrWidth - 1;我= + 1)开始ram[我]= 0;结束dout_b = 0;/ / if - else条件——不支持如果(电导率)万博1manbetx开始dout_a = 0;其他结束开始dout_a = 4; end end // Variable assignment to RHS - not supported dout_a = write_data; // Use assignment statements instead for // dout_a and dout_c // dout_a = 4; // dout_c = 32; // end // end endmodule |
所有维度的信号不引用时使用。 | 使用所有维度的一个信号输入Verilog代码。如果您指定一个额外的维度,它创建一个索引选择。 例如,这个Verilog代码创建一个 模块dataconv (clk, a, b, c);输入时钟;输入导线(1:0),b;输出线(1:0)c;1:0 1:0 reg [7:0] temp_reg [] [];/ / temp_reg不是索引/ /两个维度——不支持总是@ (posedge clk)开始temp_reg [万博1manbetx0] < = [0] + b [0];temp_reg [1] < = a [1] + [1];结束/ /索引时使用两个维度变量/ / @总是(posedge clk)开始/ / temp_reg [0] [0] < = [0] + b [0];/ / temp_reg [0] [1] < = [0] + b [1];/ / temp_reg [1] [0] < = a [1] + [0]; // temp_reg [1][1] <= a[1] + b[1]; // You can also perform indexed bit select // temp_reg [1][0][1] = 1'b0; // end assign c = temp_reg; endmodule |