在verilog中实例化顺序块的方法

时间:2016-06-24 17:05:53

标签: verilog system-verilog

我想在另一个模块中实例化顺序计数器块。这些是以下模块。当我在synopsys设计视觉环境中合成这些模块时,它提供以下错误消息,

  

prob_calculator.sv:1:非法引用内存概率。 (VER-253)

module counter #(parameter m=16) (input en,input clk,input reset,output reg [m-1:0] out);

always @(posedge clk)
if(reset) begin
    out <= 0;
end
else if (en) begin
    out <= out+1;
end
endmodule

计数器块的实例化:

module prob_calculator #(parameter n=32,parameter m=6,parameter Ir=14) (input
[n-1:0]b,input clk,input reset,output reg [m-1:0] prob [0:Ir-1]);

genvar i;
generate
for (i=0;i<Ir;i=i+1) begin:x1
counter #(.m(m)) count_blck(.en(1),.clk(clk),.reset(reset),.out(prob[i]));
end
endgenerate
endmodule

任何人都可以指出代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

Verilog不支持通过端口的多维数组。 SystemVerilog支持多维阵列端口。但是,并非所有SystemVerilog合成器都支持此功能。

在讨论如何解决多维端口约束之前,我想指出probe应该声明为wire而不是reg。在Verilog中,当一个变量由当前模块中的过程块(即regalways)分配时(而不是其子模块或父模块),它应声明为initial ),否则应声明为wire。使用SystemVerilog,您还可以使用logic,并可以更自由地使用logic类型;您使用reg的所有地方以及您使用wire的大多数地方(排除有多个驱动器的wires)。

如果您将probereg更改为wire,可能会让您的合成器感到满意,但可能不会。

一种方法是将prob展平为单个向量:将output reg [m-1:0] prob [0:Ir-1]更改为output wire [Ir*m-1:0] prob。然后将out和probe之间的连接更改为一段新的概率向量:.out(prob[i]).out(prob[i*m +: m])(参见Indexing vectors and arrays with +:)。这种方法适用于SystemVerilog和Verilog(IEEE1364-2001及以上版本)。

module prob_calculator #(parameter n=32,parameter m=6,parameter Ir=14) (input
[n-1:0]b,input clk,input reset,output wire [Ir*m-1:0] prob);

  genvar i;
  generate
    for (i=0;i<Ir;i=i+1) begin:x1
      counter #(.m(m)) count_blck(.en(1),.clk(clk),.reset(reset),.out(prob[i*m +: m]));
    end
  endgenerate
endmodule

SystemVerilog提供了其他可能性,例如使用(typedef,压缩structinterfacemodport),如果多维端口不是直接的话,可以解决这个问题支持的。最好参考您的合成器手册,确保启用SystemVerilog选项并检查哪些功能不受支持。

仅供参考:使用SystemVerilog,它重新开始使用always_ff@(posedge clk)代替always@(posedge clk)