Verilog'if'语句使用变量
虽然变量'j'不是genvar变量,但genvar中有以下verilog代码。当我检查语法(使用Xilinx)时,我在'if'语句的行上收到错误“if if语句中的非法条件表达式”。将“j”更改为genvar变量不能解决问题,我该如何正确读取“j”?谢谢你的帮助。Verilog'if'语句使用变量
genvar i;
generate
integer j=0;
for(i=0; (i<10); i=i+1) begin: gen_columns
if (j==0) begin
//some code
end
assign j=j+1;
end
endgenerate
的生成块需要时阐述的设计加以解决,以标准的Verilog模块的项目(模拟开始之前)。在你的例子中,该工具试图将if (j==0)
评估为一个常量,并且不能这样做。
从你的例子中不清楚你想要做什么。下面是对我工作的一对夫妇的例子:
wire [9:0] w;
genvar i;
generate
for(i=0; (i<10); i=i+1) begin: gen_columns
if (i==0) begin
assign w[i] = 1'b0;
end else begin
assign w[i] = 1'b1;
end
end
endgenerate
initial begin
$display ("%x", w);
$finish;
end
此代码遍历总线的位并分配取决于位不同的值。输出是3fe
。
reg clk;
integer j [0:1];
genvar i;
generate
for(i=0; (i<2); i=i+1) begin: gen_columns
always @(posedge clk) begin
if (j[i]==0) begin
j[i] <= j[i] + 1;
end
end
end
endgenerate
initial clk = 1'b0;
always #1 clk = ~clk;
initial begin
$monitor ("%d: j[0]: %d, j[1]: %d", $time, j[0], j[1]);
repeat (2) @(posedge clk);
j[0] = 0;
j[1] = 0;
repeat (2) @(posedge clk);
$finish;
end
此代码为j[0]
和j[1]
创建相同逻辑递增他们是否是零。输出是:
0: j[0]: x, j[1]: x
3: j[0]: 0, j[1]: 0
5: j[0]: 1, j[1]: 1
我的第二种情况和你的例子之间的区别是,if语句和赋值被放置在一个always块。设计完成后,该工具将用两个始终代替生成块,其中一个为i=0
,另一个为i=1
。
样式说明:虽然从多个总是更新变量的变量是合法的verilog,但它并不被认为是好的做法。它可能会合成为乘法驱动信号,并可能在仿真中引入竞争条件。在我的第二个例子中,如果作业是j = j + 1
(不含[i]
),那么j
将被分配到多个始终块中。
从上面的代码片段中,我无法弄清楚你想要建立什么类型的硬件。
for循环:以Verilog for循环主要用于
- iterating over a set of bits for an operation (XORing, demux, et cetera)
- creating multiple instances of a structure using generate statements
直从Verilog的LRM用于生成 - 环:
甲生成回路允许一个或多个变量声明,模块,用户定义的基元,使用for循环多次实例化门基元,连续分配,初始块和总是要实例化的块 。在生成for循环中使用的索引循环变量应声明为genvar。 for循环中的两个genvar赋值应分配给同一个 genvar,它是循环索引变量。 for循环中的第一个genvar赋值不应该引用右边的循环索引变量 。
在你的代码,什么是j的目的是什么?在Verilog中,分配变量然后在同一过程块中将其用作控制逻辑的做法很糟糕。很可能你需要在生成循环之外的另一个j的程序块。我不知道代码中j的用途,但可能类似于以下内容?
// continuously increment counter each clock cycle
// asynchronous reset capability
integer j;
always @(posedge clock, posedge reset)
if (reset) j <= 0;
else j <= j + 1;