systemverilog中逻辑语句的非常量索引

时间:2015-11-23 06:01:16

标签: verilog system-verilog

我正在尝试创建一个for循环,在循环迭代的情况下为逻辑数组分配不同的值。

所以,例如,让我们说我试图实例化两个不同的砖,宽度为10,高度为5.我们也说这些值都是10位。对于两块砖,我有代码:

logic[19:0] Brick_Width;
logic[19:0] Brick_Height;

第一块砖的宽度和高度将被分配到最高有效10位,第二块被分配到最低有效10位。

这是我目前的代码:

int i = 19;
initial
begin
 for(i=19; i>=0; i=i-10)
 begin
  assign Brick_Width[i:i-9] = 10;
  assign Brick_Height[i:i-9] = 5;
 end
end

然而,我得到一个错误,说"我"不是一个常数。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:6)

使用:运算符的常用范围选择必须具有常量。您的意图可以通过所谓的位选择运算符来完成。

参考LRM 1800-2012中的示例,第11.5节如下:

logic [31: 0] a_vect;
logic [0 :31] b_vect;
logic [63: 0] dword;
integer sel;
a_vect[ 0 +: 8] // == a_vect[ 7 : 0]
a_vect[15 -: 8] // == a_vect[15 : 8]
b_vect[ 0 +: 8] // == b_vect[0 : 7]
b_vect[15 -: 8] // == b_vect[8 :15]
dword[8*sel +: 8] // variable part-select with fixed width

+:-:运算符必须用于位切片或部分选择,就像您的情况一样。在这里,您要从ii-9选择一个部分,因此必须使用-:运算符。与Brick_Height[i-:9]=...

一样

例如,

x +: Y, the start position is x and count up from x by Y. Y is necessarily a constant.
x -: Y, the start position is x and count down from x by Y. Y is necessarily a constant.

assign块内的initial语句,还有连续程序分配。在这种情况下,位选择不会起作用。要做到这一点,只需删除 assign 声明即可。如下:

for(i=19; i>=0; i=i-10)
 begin
    Brick_Width[i-:9] = 10; // no assign, rest all the stuff is same
    Brick_Height[i-:9] = 5;
 end

如果持续驾驶是意图,请使用生成块

genvar i;
generate
for(i=19; i>=0; i=i-10)
begin
    assign Brick_Width[i-:9] = 10;
    assign Brick_Height[i-:9] = 5;
end
endgenerate

有关位选择的更多信息,请访问this链接。

侧面注意:

参考您问题中的以下短语:

  

对于两块砖,我有代码:

您必须拥有数组,例如logic[9:0] Brick [2]