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)
但是,我得到一个错误,说"我"不是一个常数.关于如何做到这一点的任何想法?
常用的范围选择使用:运算符必须具有常量.您的意图可以通过所谓的位选择运算符来完成.
参考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)
在+:与-:运营商必须用于位切片或部分选择在你的情况.在这里,你想从选择部分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.
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].