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

Ish*_*a S 1 verilog system-verilog

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

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

logic[19:0] Brick_Width;
logic[19:0] Brick_Height;
Run Code Online (Sandbox Code Playgroud)

第一块砖的宽度和高度将被分配到最重要的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
Run Code Online (Sandbox Code Playgroud)

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

sha*_*111 8

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

参考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
Run Code Online (Sandbox Code Playgroud)

+:-:运营商必须用于位切片或部分选择在你的情况.在这里,你想从选择部分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.
Run Code Online (Sandbox Code Playgroud)

还有一件事,块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
Run Code Online (Sandbox Code Playgroud)

或者如果连续驾驶是意图,则使用生成块.

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
Run Code Online (Sandbox Code Playgroud)

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

边注:

请参阅您问题中的以下短语:

对于两块砖,我有代码:

你必须拥有和数组一样logic[9:0] Brick [2].