Verilog net 到 reg 分配

发布于 2024-10-28 00:34:48 字数 1896 浏览 4 评论 0原文

我有一个来自_LS(511:0) 的输入端口。这在我的模块中被声明为电线。我将其分配给一组 32 个寄存器 ilb(0:31),每个寄存器的长度为 1 尼特。我试图使用 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];

但我想一定有更好的方法来做到这一点。谁能告诉我怎么做?

I have an input port from_LS(511:0). This is declared as wire in my module. I am assigning this to a set of 32 registers ilb(0:31), each of which are 1 nits long. I was trying to use the for loop to do this.

 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

I was getting the error that I should not use a variable index. The error is :

# ** Error: C:/Modeltech_pe_edu_10.0/examples/COMP ARC/inst_line_buf.v(55): Range must be bounded by constant expressions.

So i wrote down the following:

ilb[0]= from_LS[511:496];
ilb[1]= from_LS[495:480];
ilb[2]= from_LS[479:464];
....
ilb[31]= from_LS[15:0];

But i guess there must be a better way to do this. Could anyone tell me how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

从此见与不见 2024-11-04 00:34:48

原始的 verilog 不允许这种表达式,因为它想确保宽度始终正确(确实如此,但在早期编译器并不那么好:-)。

Verilog 2001提供了一些带有+的解决方案:您可以指定宽度
例如循环中的 from_LS[ 511-(16*i) +:16 ]

编辑:另一种解决方案是在里面放置另一个循环,它逐位复制 16 位。

The orginal verilog doesnt allow this kind of expression as it wanted to assure that the width is always right (it is, but in earlier times compilers werent as good :-).

Verilog 2001 offers some solution with +: you can specify the width
e.g. from_LS[ 511-(16*i) +:16 ] in your loop.

EDIT: Another solution would be to put another loop inside, which copies 16 bits bit by bit.

_畞蕅 2024-11-04 00:34:48

您应该包含更多代码(至少到包含敏感度列表循环的 always 块)以及您收到的确切错误。

如果将 integer i 更改为 genvar i 并将 for 包装在 generateendgenerate 中,它会起作用吗?

You should include more code (at least up to the always block containing that loop for the sensitivity list) and the exact error you're getting.

Does it work if you change integer i to genvar i and wrap the for in generate and endgenerate?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文