在 SystemVerilog 中生成内部 always_comb 块
Generate inside always_comb block in SystemVerilog
我知道在 SystemVerilog 的 always_comb
块中不能有 generate
,但我想做一些类似于下面显示的事情,但我不知道该怎么做.
genvar i, j;
generate
for (i = 0; i < 4; i++) begin
always_comb begin
unique case (STATE)
0: begin
...
for(j = 0; j < 8; j++)
var[j*8+2*i+1:j*8+2*i] = 2'b11;
end
...
endcase
end
end
endgenerate
现在它给我以下编译错误:Unknown range in part select
如有任何帮助,我们将不胜感激。
var
是verilog中的关键字,不能作为变量使用。
genvar j
不能在 always 块内修改。
- partselect system verilog 至少要有一个恒定的宽度。
- 你错过了
endgenerate
所以,你需要
- 将
var
重命名为其他名称
- 将
j
声明为非 genvar 变量,即 int
- 您的宽度始终是
2
,因此您可以使用系统 verilog +:
或 -:
范围说明符
- 在 system verilog 中您不再真正需要
generate..endgenerate
标记。
这里有一个例子:
genvar i;
//generate
for (i = 0; i < 4; i++) begin: loop
always_comb begin
unique case (STATE)
0: begin
//...
for(int j = 0; j < 8; j++)
v[j*8+2*i +: 2] = 2'b11;
//v[j*8+2*i+1:j*8+2*i] = 2'b11;
end
//...
endcase
end
end
//endgenerate
我知道在 SystemVerilog 的 always_comb
块中不能有 generate
,但我想做一些类似于下面显示的事情,但我不知道该怎么做.
genvar i, j;
generate
for (i = 0; i < 4; i++) begin
always_comb begin
unique case (STATE)
0: begin
...
for(j = 0; j < 8; j++)
var[j*8+2*i+1:j*8+2*i] = 2'b11;
end
...
endcase
end
end
endgenerate
现在它给我以下编译错误:Unknown range in part select
如有任何帮助,我们将不胜感激。
var
是verilog中的关键字,不能作为变量使用。genvar j
不能在 always 块内修改。- partselect system verilog 至少要有一个恒定的宽度。
- 你错过了
endgenerate
所以,你需要
- 将
var
重命名为其他名称 - 将
j
声明为非 genvar 变量,即int
- 您的宽度始终是
2
,因此您可以使用系统 verilog+:
或-:
范围说明符 - 在 system verilog 中您不再真正需要
generate..endgenerate
标记。
这里有一个例子:
genvar i;
//generate
for (i = 0; i < 4; i++) begin: loop
always_comb begin
unique case (STATE)
0: begin
//...
for(int j = 0; j < 8; j++)
v[j*8+2*i +: 2] = 2'b11;
//v[j*8+2*i+1:j*8+2*i] = 2'b11;
end
//...
endcase
end
end
//endgenerate