Verilog OR数组元素

时间:2017-03-15 19:29:44

标签: arrays for-loop verilog system-verilog

我想要参数化数量的32位总线,如下所示: out_bus = bus1 | bus2 |公交车3 | ...... |巴士N;

我还想将总线声明为数组(N是固定参数,在编译时定义):

reg [31:0]总线[N-1:0];

我能想到的最好的方法就是这样:

parameter N;
reg [N-1:0] temp;
reg [31:0] out_bus;
reg [31:0] bus[N-1:0];

always @(*) begin       
   for (j=0; j<32; j=j+1) begin : bits
     for (k=0; k < N; k=k+1) begin : bus
       temp = bus[k][j];
     end
     out_bus[j] = |temp;
   end
end

这需要是可综合的。那必须是一个更干净/更好的方式,不是吗?

3 个答案:

答案 0 :(得分:4)

如果您使用的是SystemVerilog,则可以用

替换整个always
assign out_bus = bus.or();

答案 1 :(得分:2)

这使用少一个for循环和少一个临时信号:

reg [31:0] out_bus;
reg [31:0] bus[N-1:0];
integer k;

always @(*) begin       
    out_bus = {32{1'b0}};
    for (k=0; k < N; k=k+1) begin
        out_bus = out_bus | bus[k];
    end
end

答案 2 :(得分:0)

Quartus中的以下代码给出了预期的结果,如示意图所示。

module example #(
  parameter  WIDTH    = 32,
  parameter  DEPTH    = 4
)(
  input  [DEPTH-1:0][WIDTH-1:0]  DataIn,
  output reg [WIDTH-1:0]         DataOut
);

reg [WIDTH-1:0] ORDatain;

always@(*)
  begin
    ORDatain = 32'h0000_0000;
    for(int index=0; index <DEPTH; index++)
      ORDatain = ORDatain | DataIn[index];
  end

assign DataOut = ORDatain;

endmodule