1

我很难用生成块来表示一个简单的分配。我的意图是分配 bus = disp[0] | 显示[1] | 显示 [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
4

1 回答 1

3

那是对生成和分配的错误使用。

generate 不应该在 Verilog 中随意使用,它们的使用应该是特殊的,比如扩展模块以进行参数化等。

如果它可以静态展开(根据您在此处的用法),则可以使用普通的 for 循环。Generates 通常用于参数化模块实例化;

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

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

wire bus;
assign bus = |disp ;

更新1

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
于 2013-07-17T10:22:44.083 回答