verilog行为建模(五):条件语句

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1.if 和 if-else 语句:

  • 可以多层嵌套。在嵌套if序列中,else和前面最近的if相关。
  • 为提高可读性及确保正确关联,使用begin…end块语句指定其作用域。

描述方式:

if (表达式)
  begin
    ……
  end
else
  begin
    ……
  end

举例:

always #20
  if (index > 0) // 开始外层 if
    if (rega > regb) // 开始内层第一层 if
      result = rega;
    else
      result = 0; // 结束内层第一层 if
  else
    if (index == 0)
    begin
      $display(" Note : Index is zero");
      result = regb;
    end
    else
      $display(" Note : Index is negative");

2.条件语句(case分支语句)

在Verilog中重复说明case项是合法的,因为Verilog的case语句只执行第一个符合项。

case语法:

case <表达式>
  <表达式>:赋值语句或空语句;
  <表达式>:赋值语句或空语句;
  default:赋值语句或空语句;

module compute (result, rega, regb, opcode);
input [7: 0] rega, regb;
input [2: 0] opcode;
output [7: 0] result;
reg [7: 0] result;
always @( rega or regb or opcode)
      case (opcode)
            3'b000 : result = rega + regb;
            3'b001 : result = rega - regb;
            3‘b010 : // specify multiple cases with the same result
            3'b100 : result = rega / regb;
            default : begin
                 result = 'bx;
                 $display (" no match");
             end
       endcase
endmodule

case语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件语句:

  • Case语句进行逐位比较以求完全匹配(包括x和z)。
  • Default语句可选,在没有任何条件成立时执行。此时如果未说明default,Verilog不执行任何动作。
  • 多个default语句是非法的。
    重要内容:
  • 使用default语句是一个很好的编程习惯,特别是用于检测x和z。
  • Casez和casex为case语句的变体,允许比较无关(don‘t-care)值。
  • case表达式或case项中的任何位为无关值时,在比较过程中该位不予考虑。
      1. 在casez语句中,? 和 z 被当作无关值。
      2. 在casex语句中,?,z 和 x 被当作无关值。

3.循环(looping)语句

有四种循环语句:

  1. repeat:将一块语句循环执行确定次数。

repeat (次数表达式) <语句>

  1. while:在条件表达式为真时一直循环执行

while (条件表达式) <语句>

  1. forever:重复执行直到仿真结束

forever <语句> (不可综合)

  1. for:在执行过程中对变量进行计算和判断,在条件满足时执行

for(赋初值;条件表达式;计算) <语句>

3.1 repeat (次数表达式) 语句举例

// Parameterizable shift and add multiplier
module multiplier( result, op_a, op_b);
      parameter size = 8;
      input [size:1] op_a, op_b;
      output [2* size:1] result;
      reg [2* size:1] shift_opa, result;
      reg [size:1] shift_opb;
      always @( op_a or op_b) begin
            result = 0;
            shift_opa = op_a; // 零扩展至16位
            shift_opb = op_b;
            repeat (size) begin
                  #10 if (shift_opb[1]) result = result + shift_opa;
                  shift_opa = shift_opa << 1; // Shift left
                  shift_opb = shift_opb >> 1; // Shift right
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值