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

在Verilog中,如何在逻辑中使用变量,verilog,system-verilog,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 genvari,j; 生成 对于(i=0;i

假设我有以下代码:

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
genvari,j;
生成
对于(i=0;i

这是一个可合成的表达式吗?看起来应该是这样的,因为这将展开成一系列与常量赋值相比较的赋值。如果没有,我将如何写这篇文章来完成它?

没有。想象一下展开这篇文章并用手将其打印出来。前两条线将导致多重驱动网络:

assign match[0] = (entry[0] == 0);
assign match[0] = (entry[1] == 0);
但是,如果您摆脱了generates,并使用always块中的循环执行此操作,则它将起作用:

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

不,想象一下展开这个,然后用手把它打印出来。前两条线将导致多重驱动网络:

assign match[0] = (entry[0] == 0);
assign match[0] = (entry[1] == 0);
但是,如果您摆脱了generates,并使用always块中的循环执行此操作,则它将起作用:

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

您是否在实际的合成和实现工作流中尝试过此代码?查看RTL和技术示意图(如ISE提供的示意图)以及任何synth工具输出或警告可能非常有用。您是否在实际的合成和实现工作流中尝试过此代码?查看RTL和技术示意图,如ISE提供的示意图,以及任何synth工具输出或警告,可能会非常有用。