2013-07-17 47 views
1

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

回答

3

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

产生不应该使用的是宽松的Verilog和它们的使用应该是这样延伸的模块参数化一些特别的东西等

如果可以静态地展开(根据您的使用情况在这里),然后循环纯本来可以使用的。生成通常用于参数化模块实例;

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

您的代码看起来你只是想或disp总线,这可以用一个或还原操作来实现:

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