在Verilog中,我如何在逻辑中使用变量

时间:2016-03-29 23:06:49

标签: verilog system-verilog

说我有以下代码:

genvar i,j;
generate
for(i = 0; i < MAX; i = i + 1) begin: gen_blah
  for(j = 0; j < MAX; j = j + 1) begin: gen_foo
    assign match[i] = entry[j] = i;
  end
end
endgenerate

这是一个可综合的表达吗?它似乎应该是因为它将展开成一堆比较常数分配。如果没有,我将如何写这个来实现这个目标?

1 个答案:

答案 0 :(得分:1)

没有。想象一下,展开它并手动输入。前两行将导致多重驱动网:

assign match[0] = (entry[0] == 0);
assign match[0] = (entry[1] == 0);

但是,如果你摆脱了生成并使用循环内部的循环执行此操作,那么它将起作用:

always_comb begin
  for(int i = 0; i < MAX; i = i + 1) begin: gen_blah
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo
      match[i] = (entry[j] == i);
    end
  end
end

在此块中,您可以获得相同值的多个赋值,但最后一个赋值为“wins”。我不确定你要用你的代码完成什么,所以这可能实际上并没有执行你正在寻找的功能。如果您要查看是否有任何条目等于i,那么您应将其更改为:

always_comb begin
  for(int i = 0; i < MAX; i = i + 1) begin: gen_blah
    match[i]=0;
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo
      match[i] = match[i] || (entry[j] == i);
    end
  end
end