微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > always组合逻辑的问题

always组合逻辑的问题

时间:10-02 整理:3721RD 点击:
always @(a or b or c or d or e or f or g or h or i or j or k or g or m)
begin
    if(!a)
        dout=1'b1;
    else if(b && !c)
              dout=din;
    else if(e && (b || f) || (g && (!h)))
              dout=1'b1;
    else if((b && i && j) || (f && k) || (g && m))
              dout = 1'b0;
    else
             dout=dout;
end
1、这样一个逻辑会不会违反coding style
2、最后一个dout=dout,dout需不需要写到敏感列表里去,不写的话会不会有生成锁存器的风险。或者有没有更优的写法。

1. 会违反coding style。
2. 就是最后这个条件违反了coding style。要明确的是,是否有锁存器不是由敏感列表决定的,而是由你写的代码决定,这里的最后一句,无论你是否有敏感列表,都有锁存器。
3. 任何的组合逻辑没有保存当前值的功能,只有时序逻辑中的寄存器才可以做到。所以,如果你要dout=dout,那么就要用时序逻辑来做。

谢谢楼上大侠的回答,很detail,many thanks!
若我需要在除去以上四个条件之外的条件下dout保持原值无法用组合逻辑实现了?

使用 always @ ( * )
最后的dout=dout会综合成为latch,也是可以使用的

设计要求if(b && !c),dout必须等于din,不能有任何区别,那该怎么做呀

    这样是综合成MUX了吧,如果没记错的话

肯定综合成LATCH了

个人认为如果将dout设置成register类型,那会变成latch!好像没有2种情况可供选择的吧!

这个必定是综合成latch,但是用latch不是容易出现亚稳态嘛,,我这里若要实现功能也必须冒着这个风险咯,,,我想知道这样能是可靠设计么

always块尽量作为时序逻辑设计,纯组合逻辑是不锁存的

前面的always @(。)变成always @(negegdge rstb or posedge clk),
=变成 <= 不就成寄存器实现了么。

想问一下小编,你的din也是一位2进制的数吗?这样是不是和下面的一种情况矛盾呢?

应该会违反coding style吧

不光是生成LATCH的问题,关键是组合反馈了。

这种写法不好,verilog2001支持always@(*)的写法,会将always块中使用的全部信号都列在敏感列表中,这样写防止出错

如果全部条件不满足时,输出dout是不关心的值得话,随便赋一个值1 or 0 or x。
否则肯定综合出latch

觉得也应该会综合成锁存器,最后一分支,就看有没有必要将dout值重新赋值dout。

解释得非常准确!

1、组合逻辑里面没有锁存
     物理上组合逻辑就是一堆门用线连起来,输入和输出相同其实就是一根线不通过任何门电路
     如果加上判断条件才直通也就是传输门。
2、敏感列表里面有个d信号没有用到。
3、verilog-2001里面支持 always@(*)写法,可以不用添加敏感列表。

还有一种SystemVerilog的写法:always_comb @ *

不会有LATCH的生成,  但是有是组合回路了,DC STA基于时序的工具在这个地方都会出问题
没有 最后一句就会生成 LATCH。
你可以用DC跑一下

always @(rst or d or q5)
begin
if(rst)
q5 =d;
else
q5=q5;

最后一句会导致综合工具综合出Latch!~Latch一般不提倡使用吧,不利于时序分析和DFT设计!~

建议你还是多看看书,这方面教材很多·····verilog

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

网站地图

Top