首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组元素的Verilog OR运算

数组元素的Verilog OR运算
EN

Stack Overflow用户
提问于 2017-03-16 03:29:44
回答 3查看 1.9K关注 0票数 3

我想对32位总线的参数化数量进行OR运算,如下所示: out_bus = bus1 | bus2 | bus 3| ... | bus N;

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

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

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

代码语言:javascript
复制
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

这需要是可合成的。一定有更干净/更好的方法,不是吗?

EN

回答 3

Stack Overflow用户

发布于 2017-03-16 03:49:10

如果您使用的是SystemVerilog,则可以将整个always块替换为

代码语言:javascript
复制
assign out_bus = bus.or();
票数 4
EN

Stack Overflow用户

发布于 2017-03-16 03:42:00

这使用了更少的for环路和更少的临时信号:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-27 17:04:36

quartus中的以下代码给出了预期的结果,并在图解视图中进行了验证。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42819017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档