求助,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里面
谢谢各位的帮助!
