我正在尝试创建一个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
然而,我得到一个错误,说"我"不是一个常数。关于如何做到这一点的任何想法?
答案 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
+:
和-:
运算符必须用于位切片或部分选择,就像您的情况一样。在这里,您要从i
到i-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]
。