Verilog&x27;如果';使用变量的语句

Verilog&x27;如果';使用变量的语句,verilog,Verilog,我在genvar中有以下verilog代码,尽管变量“j”不是genvar变量。当我检查语法(使用Xilinx)时,我在带有“if”语句的行上收到错误“generate if statement中的条件表达式非法”。将“j”更改为genvar变量并不能解决此问题,如何正确读取“j”?谢谢你的帮助 genvar i; generate integer j=0; for(i=0; (i<10); i=i+1) begin: gen_columns if (j==0)

我在genvar中有以下verilog代码,尽管变量“j”不是genvar变量。当我检查语法(使用Xilinx)时,我在带有“if”语句的行上收到错误“generate if statement中的条件表达式非法”。将“j”更改为genvar变量并不能解决此问题,如何正确读取“j”?谢谢你的帮助

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
genvari;
生成
整数j=0;

对于(i=0;(i当详细设计时(模拟开始之前),需要将生成块解析为标准的verilog模块项。在您的示例中,该工具试图将(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
此代码为
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块中。当详细说明设计时,该工具将用两个always块替换生成块,一个块为
i=0
,另一个块为
i=1


风格提示:虽然verilog从多个always块更新变量是合法的,但这不是一个好的做法。它可能会合成为一个乘法驱动信号,并可能在模拟中引入竞争条件。在我的第二个示例中,如果赋值为
j=j+1
(不含
[i]
),然后将
j
分配到多个always块中。

从上面的代码片段中,我无法确定您尝试建模的硬件类型

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循环。在generate 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;
//每个时钟周期计数器持续递增
//异步复位能力
整数j;
始终@(posedge时钟、posedge重置)
如果(重置)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;