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