如何在Verilog生成块中表示赋值逻辑数组?

时间:2013-07-17 09:28:40

标签: verilog system-verilog

我在使用生成块表示简单赋值时遇到了困难。 我的意图是       assign bus = disp [0] | disp [1] | disp [2] ......; 以下代码不起作用。我该如何解决?这种与累积相关的任务不会出现在Verilog手册中。提前感谢任何建议。

genvar varx;
for (varx = 0; varx < `N; varx = varx + 1) begin
    if (varx == 0) assign bus = disp[0];
    else assign bus = bus | disp[varx];
    end

1 个答案:

答案 0 :(得分:3)

这是生成和分配的错误用法。

不应该在Verilog中使用

生成,并且它们的使用应该是特殊的,比如扩展参数化模块等。

如果可以静态展开(根据您的使用情况),则可以使用plain for循环。 Generates通常用于参数化模块实例化;

assign应该每线一次并且不断地将右侧表达式驱动到该线上。

您的代码看起来就像是在尝试OR disp总线,这可以通过OR减少运算符来实现:

wire bus;
assign bus = |disp ;

<强> UPDATE1

disp实际上被定义为一个内存,我们不会尝试计算单个位或减少。这里可以使用for循环来计算OR。

logic [3:0] data [5:0];
logic [3:0] or_data;
integer i;

always @* begin
  or_data = 4'b0; 
  for(i=0; i<6; i=i+1) begin
    or_data = or_data | data[i] ;
  end
end

简单模拟:

logic [3:0] data [5:0];
logic [3:0] or_data;
integer i;
initial begin
  for(i=0; i<6; i=i+1) begin
    data[i] = i*2;
  end
  #1ns;
  for(i=0; i<6; i=i+1) begin
    $displayb(data[i]);
  end

  or_data = 4'b0; 
  for(i=0; i<6; i=i+1) begin
    or_data = or_data | data[i] ;
  end
  #1ns;
  $displayb(or_data);
end