当前位置:   article > 正文

Verilog语言之结构语句:if、case_verilog if和case区别

verilog if和case区别

if语句

一个if语句通常可以创造出一个2选1选择器,当条件为真时选择一个输入,为假时选择另一个。

  1. always @(*) begin
  2. if (condition) begin
  3. out = x;
  4. end
  5. else begin
  6. out = y;
  7. end
  8. end

这等同于连续性赋值语句的条件运算符

assign out = (condition) ? x : y;

然而if语句也增加了更多制造错误方式,只有当out总是被赋值时电路才是组合型的。~https://hdlbits.01xz.net/wiki/Always_if


 一个普遍的错误来源:如何避免制造锁存器

当我们设计一个电路时,首先要考虑的应该是电路

  • 我想要一个逻辑门
  • 我想要一个三输入三输出的组合逻辑
  • 我想要一个有一系列触发器的组合逻辑电路

一定不要先写代码,然后希望由代码产生一个适当的电路。

  • If (cpu_overheated) then shut_off_computer = 1;
  • If (~arrived) then keep_driving = ~gas_tank_empty;

语法正确的代码不一定会产生一个合理的电路(组合逻辑+触发器)。通常的原因是:我们需要考虑在我们指定的情况之外发生了什么?Verilog的回答是:保持输出不变。

保持输出不变这个行为意味着当前状态需要被记住,因此就产生了一个锁存器。组合逻辑(比如逻辑门)不能记住任何状态。注意这条信息:Warning (10240): ... inferring latch(es),除非是我们有计划的产生一个锁存器,它通常意味着一个bug。组合电路必须在所有条件下都给输出信号赋一个值,这也就意味着我们必须写else从句,或者是在这个always过程块的第一句也就是case之前,就给输出信号提前赋一个默认值。case语句中同样要注意这个问题。

always @(*) begin
    up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;
    case (scancode)
        ... // Set to 1 as necessary.
    endcase
end

https://hdlbits.01xz.net/wiki/Always_if2


case语句

在Verilog中case语句等同于一系列的if-elseif-else语句,在这些语句中把一个条件表达式和其他的相比较。它的语法和功能不同于c语言中的switch。

  1. always @(*) begin // This is a combinational circuit
  2. case (in)
  3. 1'b1: begin
  4. out = 1'b1; // begin-end if >1 statement
  5. end
  6. 1'b0: out = 1'b0;
  7. default: out = 1'bx;
  8. endcase
  9. end
  • case语句以case开始,并且每一个case可选项以冒号:结束。
  • 每个case选项可以准确地执行一条语句。这意味着如果你需要执行多条语句,那么你必须使用begin...end。
  • 重复(和部分重复)case选项是被允许的,将会执行第一个匹配的case选项。

casez、casex 

在优先编码器中经常会用到casez,case语句的行为就像是按顺序检查每一项(事实上,更像一个巨大的真值表),一旦第一项符合就不会再执行后面的可选项了,因此为了编码时缩短代码和编码后方便阅读,可选项可以部分重复。

  1. always @(*) begin
  2. casez (in[3:0])
  3. 4'bzzz1: out = 0; // in[3:1] can be anything
  4. 4'bzz1z: out = 1;
  5. 4'bz1zz: out = 2;
  6. 4'b1???: out = 3;
  7. default: out = 0;
  8. endcase
  9. end
  • casex和casez类似,它把x和z都会当做don't care,其实casex并没有什么卵用,casez就足够用了。
  • 问号?是z的同义词,因此 2'bz0 和 2'b?0 是一样的。

https://hdlbits.01xz.net/wiki/Always_casez

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/101522?site
推荐阅读
相关标签
  

闽ICP备14008679号