大家帮忙看看这小段Verilog代码,多谢!
always @ (negedge nReset or posedge CLK)
if(!nReset)
begin
a<=0;
b<=0;
c<=0;
end
else
begin
a<=a;
b<=b;
c<=c;
if(d) a<=a+1'b1;
if(e)
begin
a<=0;
c<=0;
if(d || a) c<=1;
if(a>b) b<=a;
if(d && a+1'b1)>b) b<=a+1'b1;
end
end
我觉得有点问题:如果d和e同时都成立的话,那么a到底是执行加1还是置0呢?
但是这段代码编译确实没有问题的,可以正常使用。非常的疑惑啊。望高手指点。
自己顶一个哦 不然沉了
这代码写的。
你说的编译没问题 不代表功能正确
你仿一下就知道了 到处都是错
楼上何处此言 能否说的详细点 这是已经实现的项目里抽出来的一小段 我看不明白
其他没什么问题的 我就是有“如果d和e同时都成立的话,那么a到底是执行加1还是置0呢?”的疑惑
刚才确实有点问题,现在改好了。
如果你这个是已经实现的项目 只能说明有其他的逻辑保证了这部分功能的实现
比如其他逻辑保障了d和e不会同时有效 所以就不会出现你说的冲突问题
单看这段code 怎么会没有问题。
看代码可以看到的是d和e是可能同时有效的:
if(e)
begin
if(d || a) c<=1;
把整个项目里面的一小段抽出来 不好说啊 1# psd0208
自己可以去仿真
这样会覆盖
多个IF都满足时后面执行的结果会覆盖前面的结果。
貌似明白了:
begin end里面的语句是从上到下顺序执行的,所以在d和e同时有效的情况下,先执行了a+1,然后又因为满足条件而执行了a=0,这样的话最后的结果还是a=0。
不错不错!
对的 我就是这个意思 MOSFET正解 谢谢!
这代码写的?
在Quartus综合器中if...else...是有优先级的,如果d和e同时生效的时候,会优先执行d分支下的语句,而不会去执行e分支下的语句
13# sirius.yuan ?
verilog是并行执行的........
给a赋值的条件同时满足的话就会有问题.........
应该先搞清要实现什么功能再写code吧
基本同意13楼,不过不是不执行e分支下的语句,而是执行完d分支再执行e分支。
是啊,begin end 是顺序执行的。
学习了!
学习了……
谢谢。
你说的明显不对啊
赋值语句 <=和=得区别你看懂了么
阻塞和非阻塞你还是仔细考虑下吧
22# wyqkiss
此a=0,非彼a=0
这样问题很多把?reset结束了a=a,d和e满足了,a又有其他的赋值。
这么写程序的可读性太差了,应该根据条件的优先级关系把同一个寄存器的赋值按照顺序用if elseif else写写清楚。
呵呵,看看讨论也能学到点
这代码毫无可读性
不错不错!
我也是10#那样想的呀!
小编这样写代码,综合工具就没告诉你sythnsis-simulation mismatch的warning?
先不要代码不谈功能正确性,从代码的可读性方面来讲,根本不能released.一个难以看懂的代码,在绝大多数情况下,功能是错的。
