我有一个来自_LS(511:0)的输入端口。这在我的模块中声明为wire。我将其分配给一组32个寄存器ilb(0:31),每个寄存器的长度为1 nits。我试图使用for循环来做到这一点。
integer i;
genvar j;
initial
begin
count1 = 0;
count2=0;
flush_ctrl=0;
buffer_bit=0;
a=(hmic_ctrl[1]) + (hmic_ctrl[2]*2) + (hmic_ctrl[3]*4);
//assigning data from LS to ilb
for (i=0;i<=31;i=i+1)
ilb[i]=from_LS[511-(16*i) : 511-(16*(i-1))];
ilb[0]= from_LS[511:496];
ilb[1]= from_LS[495:480];
ilb[2]= from_LS[479:464];
ilb[3]= from_LS[463:448];
ilb[4]= from_LS[447:432];
ilb[5]= from_LS[431:416];
ilb[6]= from_LS[415:400];
ilb[7]= from_LS[399:384];
ilb[8]= from_LS[383:368];
ilb[9]= from_LS[367:352];
ilb[10]= from_LS[351:336];
ilb[11]= from_LS[335:320];
ilb[12]= from_LS[319:304];
ilb[13]= from_LS[303:288];
ilb[14]= from_LS[287:272];
ilb[15]= from_LS[271:256];
ilb[16]= from_LS[255:240];
ilb[17]= from_LS[239:224];
ilb[18]= from_LS[223:208];
ilb[19]= from_LS[207:192];
ilb[20]= from_LS[191:176];
ilb[21]= from_LS[175:160];
ilb[22]= from_LS[159:144];
ilb[23]= from_LS[143:128];
ilb[24]= from_LS[127:112];
ilb[25]= from_LS[111:96];
ilb[26]= from_LS[95:80];
ilb[27]= from_LS[79:64];
ilb[28]= from_LS[63:48];
ilb[29]= from_LS[47:32];
ilb[30]= from_LS[31:16];
ilb[31]= from_LS[15:0];
pctr(
.clk(clk),
.reset(0),
.offset(branch_ctrl[13:1]),
.mux_select(branch_ctrl[0]),
.pc1(pc)
);
end
我收到的错误是我不应该使用变量索引。错误是:
# ** Error: C:/Modeltech_pe_edu_10.0/examples/COMP ARC/inst_line_buf.v(55): Range must be bounded by constant expressions.
所以我写下了以下内容:
ilb[0]= from_LS[511:496];
ilb[1]= from_LS[495:480];
ilb[2]= from_LS[479:464];
....
ilb[31]= from_LS[15:0];
但我想必须有更好的方法来做到这一点。谁能告诉我怎么样?
答案 0 :(得分:2)
原始verilog不允许这种表达,因为它想要确保宽度总是正确的(它是,但在早期编译器不是很好: - )。
Verilog 2001提供了一些带+的解决方案:您可以指定宽度
例如在你的循环中from_LS[ 511-(16*i) +:16 ]
。
编辑:另一个解决方案是将另一个循环放入其中,逐位复制16位。
答案 1 :(得分:1)
您应该包含更多代码(至少包含灵敏度列表中包含该循环的always
块)以及您获得的确切错误。
如果您将integer i
更改为genvar i
并在generate
和endgenerate
中包含for,是否有效?