DC关于模块参数调用的问题,请大牛来帮忙,谢啦
... input [WIDTH-1:0] sr_in,
其中parameter的值是随便设置的,
上层模块调用为:
sr #(.WIDTH(1), .LENGTH(16)) sr_sel .......
.... .sr_in(1'b1),
但是DC综合会报错:Width mismatch on port 'sr_in' of reference to 'sr'
如果把两个模块的WIDTH都改成1的话就不会出错,这是为啥?
谢谢各位了
希望你以后把底层模块的IO模块代码贴完全.....
你这个代码问题在这里
sr #(.WIDTH(1), .LENGTH(16)) sr_sel .......
.... .sr_in(1'b1),
WIDTH(1)
如果你不是1,那么跟后面的sr_in(1'b1)端口位宽就冲突了....我发现你这个问题相当大....尤其是用"...."没贴的那部分,正好看不到问题的关键....开始我也觉得没问题....就是那个"....."害的...
后来发现你居然后面有个 ")".....这就很明显了....
如果说得不对,麻烦你贴完整代码....这个问题很简单,不过你没贴满所以我想到了好几个可能出错的地方,不方面断言...
楼上正解
应该是语法问题
你好,非常感谢你的回复,我这个问题想了几遍应该是DC对2001语法不支持的原因,我把代码贴上来
底层模块就是一个普通的移位寄存器
// 移位寄存器
module sr_cordic #(parameter WIDTH = 4, LENGTH = 8) //定义参数上层可以调用
(
input clk,
input en,
input [WIDTH-1:0] sr_in,
output[WIDTH-1:0] sr_out
);
// Declare the shift register
reg [WIDTH-1:0] sr [LENGTH-1:0];
// Declare an iterator
integer n;
always @ (posedge clk)
begin
if (en)
begin
// Shift everything over, load the incoming data
for (n = LENGTH-1; n>0; n = n-1)
begin
sr[n] <= sr[n-1];//<=
end
// Shift one position in
sr[0] <= sr_in;
end
end
// Catch the outgoing data
assign sr_out = sr[LENGTH-1];
endmodule
上层模块为:
wire sel;
sr_cordic #(.WIDTH(1), .LENGTH(16)) sr_select //调用底层的参数,如果底层模块WIDTH = 4, LENGTH = 8,就会出现不可综合
( //的情况,除非改成WIDTH = 1, LENGTH = 16,但是我上层的模块需要调用很多
.clk(clk), //个不同宽度的底层模块
.en(1'b1),
.sr_in(z_t[ANG_WIDTH-1]),
.sr_out(sel)
);
这个问题好纠结。
格式怎么变乱了,晕,大家凑合着看吧,呵呵
不知道你用的DC是哪个版本,我用的2008和2009都没碰到过语法不支持的问题。 我个人觉得这应该不是DC不支持2001的语法规则的问题.你这个模块不难,稍微改一下规格就可以把2001改成1995标准,你可以试一下...
实验室电脑没装DC,不然都可以帮你测一下
你这就是位宽不匹配嘛 比如sr_out你定的是4bit,顶成用wire定义了1bit的sel去连接,那肯定是语法错误啊
明显语法错误 4bit去连1bit 建议nLint 无waring 无error再做后面的时事
那个4是默认参数,小编实例化的时候已经改了.....
你好,问题解决了,只需要在脚本中添加 set hdlin_auto_save_templates true 即可,谢谢
小编你好,我也碰到了和你类似的问题。我的接口变量不是parameter是define的宏,也会报Error,mismatch on port ......
我加上你在10楼回复的命令也不管用。小编能介绍一下这个命令的具体作用么?
你还有没有过类似的经历?
