我想要参数化数量的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
这需要是可综合的。那必须是一个更干净/更好的方式,不是吗?
答案 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