我想对32位总线的参数化数量进行OR运算,如下所示: out_bus = bus1 | bus2 | bus 3| ... | bus 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这需要是可合成的。一定有更干净/更好的方法,不是吗?
发布于 2017-03-16 03:49:10
如果您使用的是SystemVerilog,则可以将整个always块替换为
assign out_bus = bus.or();发布于 2017-03-16 03:42:00
这使用了更少的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发布于 2018-09-27 17:04:36
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;
endmodulehttps://stackoverflow.com/questions/42819017
复制相似问题