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;