我想在另一个模块中实例化顺序计数器块。这些是以下模块。当我在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
任何人都可以指出代码有什么问题吗?
答案 0 :(得分:1)
Verilog不支持通过端口的多维数组。 SystemVerilog支持多维阵列端口。但是,并非所有SystemVerilog合成器都支持此功能。
在讨论如何解决多维端口约束之前,我想指出probe
应该声明为wire
而不是reg
。在Verilog中,当一个变量由当前模块中的过程块(即reg
或always
)分配时(而不是其子模块或父模块),它应声明为initial
),否则应声明为wire
。使用SystemVerilog,您还可以使用logic
,并可以更自由地使用logic
类型;您使用reg
的所有地方以及您使用wire
的大多数地方(排除有多个驱动器的wires
)。
如果您将probe
从reg
更改为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
,压缩struct
,interface
,modport
),如果多维端口不是直接的话,可以解决这个问题支持的。最好参考您的合成器手册,确保启用SystemVerilog选项并检查哪些功能不受支持。
仅供参考:使用SystemVerilog,它重新开始使用always_ff@(posedge clk)
代替always@(posedge clk)