请教FPGA上一个很诡异的问题
wire a = 1'b1;
test test(
.a (a ),
...
在quartus里面综合后
用signalTap看波形
发现test模块里面的a竟然是0
如果改成
.a (1'b1 ),
就对了
想请教各位这种问题的原因
谢谢!
PS:之前综合都没问题
这次是把频率提高后,加了更严格的约束后才出的问题
按理说这个直接设为1应该更频率无关的啊
难道是约束加严格了综合出问题了?
弱爆了,,,虽然哥是做验证的,但是一眼就看出来
请把 a 定义成 reg型
我没觉得有啥问题
你把wire和a=1分两行写写看
还有你的声明在调用后还是前面?
如果a的声明在调用后好像会有问题
试试看吧
仔细看看warning
这没问题吧,a显然是test的输入,用wire没问题的吧
第一次见到wire后面直接跟赋值。。。这样的风格在软件代码中很常见啊。。。你定义a的这一行莫非出现在test例化后了?
直观理解上是这样的。。之前还真没见过。。。
net declaration assignment
ieee1364-2005 6.1.1
把整个代码贴出来才好分析,这么一点信息没法分析。
查查是不是综合优化了,对a端口相关的逻辑加过反相器
貌似FPGA厂商的综合工具有的不支持wire a=1这样的语法,刚听synopsys的AE说过。改成wire a;assign a=1;试试吧。
检查综合工具或PAR工具生成的netlist,看工具是不是出于优化逻辑的需要把test的a端口取反了。
说实在的,一般综合工具都不会犯这么简单的错误的,应该是为了优化逻辑,也就是工具认为将a取反了能省资源。
这么简单的逻辑看什么信号?应该是优化掉了吧。
1, 由于你已经定义了a == 1,所以在test内部的逻辑,已经对a==1的情况进行了优化。
2,但是你定义了a是test的输入信号,在某些优化条件下,工具会保留电路层次结构和IO信号。因此a得以保留。但是这个a,在test内部对于原来的逻辑没有任何用处。你可以不用关心。
lz来通报一下结果
果然改成先声明后assign就可以了
另外,其实我之前用的是systemverilog的语法
logic a = 1;
现在改为logic a;
assign a = 1;
就可以了