微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 讨论一下这条verilog语句!高手请进!

讨论一下这条verilog语句!高手请进!

时间:10-02 整理:3721RD 点击:
在阅读代码的时候碰到这样写的语句,我现在有个疑问:
既然 ram21_pmf_i是定义成wire的,但是,它却有了保持作用,这是寄存器的功能!这是我仿真后观察到的结果。
assign ram21_pmf_i = (accu2_bypass == 1'b1) ? (accu2_result_i) : (ram21_pmf_i);
而我经常这样写:
assign ram21_pmf_i = (accu2_bypass == 1'b1) ? (accu2_result_i) : (8'd0);
前面的写法到底对不对!请高手指教。


前面的代码语法没错,但是会形成一个环路,综合的时候会报错,仿真的情况可能要取决于仿真器了.

如二楼所说,前面一种写法会出现LOOP。

学习了。

受教了



    这个综合结果是否是MUX而不是寄存器,输出结果连到了输入?这样的电路既然存在为什么也要报错呢~


不是很理解你要表达的意思,这样的回环电路在某些场合确实有,但是非常特殊,一般都是在模拟电路上.数字电路设计要绝对避免,所以一般的综合工具都会报错.

这个电路综合出来应该是个锁存器吧...一般不建议在数字电路中使用锁存器,锁存器容易产生毛刺...


谢谢指出,我今天试了一下,altera的综合器确实把这个电路认成latch了.


更正一下,我今天用altera的quartus实验一下,确实是latch,综合可以过.



综合可以过不代表design没问题。


我没说设计有没有问题,我只是说这种代码本身并没错,只是需要避免.

这个就是一个latch啊,要避免的。这个跟在组合逻辑里面if-else语句,只写if不写else是雷同的。



    要看是时序逻辑还是组合逻辑吧,如果是时序逻辑没问题的。


我也仔细的看了一下,也在Quartus里面试了一下,如果像如下方式描述就可以过
module test (input b,c,output a);
wire    b;
assign d = (b == 1'b1) ? (a) : (c);
assign a = d;
endmodule
  像这样的方式写,就能生成一个只有mux的环路而没有锁存器产生。
我觉得之所以有锁存器产生是因为ram21_pmf_i 并没有初值,而在选择端选择了ram21_pmf_i时仿真器并不知道应该用什么样的值来代替,所以才会有锁存器产生。
而像上面所描述的,在第二句中a的值有理可查,就把d的值立即取过来就好了,所以这是个仿真器的原理问题哈哈哈


我也仔细的看了一下,也在Quartus里面试了一下,如果像如下方式描述就可以过
module test (input b,c,output a);
wire    b;
assign d = (b == 1'b1) ? (a) : (c);
assign a = d;
endmodule
  像这样的方式写,就能生成一个只有mux的环路而没有锁存器产生。
我觉得之所以有锁存器产生是因为ram21_pmf_i 并没有初值,而在选择端选择了ram21_pmf_i时仿真器并不知道应该用什么样的值来代替,所以才会有锁存器产生。
而像上面所描述的,在第二句中a的值有理可查,就把d的值立即取过来就好了,所以这是个仿真器的原理问题哈哈哈


我也仔细的看了一下,也在Quartus里面试了一下,如果像如下方式描述就可以过
module test (input b,c,output a);
wire    b;
assign d = (b == 1'b1) ? (a) : (c);
assign a = d;
endmodule
  像这样的方式写,就能生成一个只有mux的环路而没有锁存器产生。
我觉得之所以有锁存器产生是因为ram21_pmf_i 并没有初值,而在选择端选择了ram21_pmf_i时仿真器并不知道应该用什么样的值来代替,所以才会有锁存器产生。
而像上面所描述的,在第二句中a的值有理可查,就把d的值立即取过来就好了,所以这是个仿真器的原理问题哈哈哈

请问你写的是代码还是电路?如果是代码,那没啥话说。如果是电路,那就是你嘴硬了。


我说的是代码,我用综合器综合了,得到了一个latch.这就是整个过程.我当然反对这样写,但是这样的电路确实客观存在.又不是物理上无法实现的.
"嘴硬"这样的话听着不舒服.

补充一句,回路loop(不是latch)是有实际价值的.不要因为我们尽量避免就否定了它的存在,就像latch我们一再避免,但是它也是实际存在的电路,是有用的.


按照你的写法用quartus试验了一下,果然从latch变成loop了,而且综合以及布线都过了.

的确是的啊


恩,呵呵。应该就是仿真器原理造成的,必须要赋给另一线网作中介

学习中,都是高手啊

二楼正解,赞一个!

不建议使用latch,是因为它时序难于分析,并且又有毛刺,并不是说不能使用,主要还是看设计的用途

产生锁存器

学习一下,这个是不是形成了一个锁存器

以前没有碰到过诶……受教了。

什么语句综合出什么电路看来要搞清楚啊。看了大家的讨论,受教很多,继续学习。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top