微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求助,verilog语言的基础问题

求助,verilog语言的基础问题

时间:10-02 整理:3721RD 点击:
近来学习verilog的过程,遇到一个问题,自己搞不明白,求各位前辈指教。问题如下:
对于以下的代码
always @(*) begin
    if (rst == `RstEnable) begin
        a                      <= 2'b00;
    end else begin
        a                      <= 2'b01;
    end
      
    case (op)
        0 :
        begin
            a                      <= 2'b10;
        end
        1 :
        begin
            a                      <= 2'b11;
        end
    endcase
end
如果是计算机软件语言a的结果很好理解,因为软件是有顺序的,后面的赋值语句会覆盖前面的赋值语句的结果。但是Verilog是硬件描述语句,所以always块中的语句是并发执行的,那么上述a的结果如何确定呢?
从仿真的结果来看和顺序执行的效果一致,但是从Verilog语言层面如何理解呢?
求帮助!

首先有一点硬件描述语言对应的是电路,好的代码风格能够综合出无竞争和冒险的电路,always@(*)开头的过程快一般用来对应的是组合逻辑电路,因此在这个过程块中最好把所有赋值符号换成阻塞赋值符号(=)这样子就比较好理解了。
当你要描述时序逻辑电路的时候一般会用always@(event)来进行,这时里面的赋值符号最好用非阻塞。

请先了解阻塞和非阻塞的区别。

只要想明白最终映射的电路就很好理解了。
比如if-else的综合结果是一个带优先级的选择器,选择器的输入端是所有的输入值,选择端是if-else的逻辑
    a---|\
         | |---> c
    b---|/
           |__sel

if-else的语句我是理解的,只是上面的例子中if-else和case语句是同级的,他们应该是没有优先级的吧。
另外,这些语句的写法是我从某些书上看来的,而介绍verilog语言的书上我没有看到过这种写法,一般要不然是if-else语句,要不然是case语句,不会并列使用的。所以,我很想知道这种写法是否属于教科书上不讲,但是平常很常见那种情况。以及这种写法下,会编译成什么样的电路。



    你好,我就是想不明白always块中if-else和case语句并列存在时会编译成什么样的电路呀!可以直接告知吗?


在always内部,由于有begin end, 所以是顺序执行的。

1. 仅就代码本身来说,always内部是顺序执行的,所以可以认为if-else先执行,case后执行,所以这是一个优先级选择,case的优先级高
2. 这种写法不严谨,不能在if-else块和case块中对同一信号进行赋值。
要清楚自己实现什么样的逻辑,而不是代码会被映射成什么电路。你的例子中,代码的逻辑如果rst使能就复位,否则a就置01, 但是case又把else的结果覆盖了,那其实正确的逻辑是把case放进else里面

谢谢各位的帮助!

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

网站地图

Top