我想定义总线宽度为32位的大量总线。
例如
input [31:0] a0, a1, a2, .... aN;
input [31:0] b0, b1, b2, .... bN;
output [31:0] c0, c1, c2, .... cN;
c0 = a0 + b0;
c1 = a1 + b1;
.
.
cN = aN + bN;
如何通过迭代实现此代码?
答案 0 :(得分:1)
Verilog Generates旨在解决此问题。如果可以将解压缩的阵列用于端口会更容易。
语句需要包含在initial
或always
中,以暗示输出是一个触发器使用always @(posedge clk)
,用于组合电路使用always @*
。
module example (
parameter N = 10
)(
input clk,
input [31:0] a [0:N],
input [31:0] b [0:N],
output reg [31:0] c [0:N]
);
genvar i;
generate
for(i=0; i<=N; i++) begin
always @(posedge clk) begin
c[i] <= a[i] + b[i];
end
end
endgenerate
endmodule
当需要参数化模块实例时,生成是好的,上面的内容可以用plain for循环重写。
integer i;
always @(posedge clk) begin
for(i=0; i<=N; i++) begin
c[i] <= a[i] + b[i];
end
end
对于可合成代码,for循环必须能够静态展开。