如何定义宽度为32位的N总线

时间:2014-10-11 01:51:44

标签: verilog

我想定义总线宽度为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;

如何通过迭代实现此代码?

1 个答案:

答案 0 :(得分:1)

Verilog Generates旨在解决此问题。如果可以将解压缩的阵列用于端口会更容易。

语句需要包含在initialalways中,以暗示输出是一个触发器使用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循环必须能够静态展开。