流程控制语句包括:
• if 语句;
• case 语句;
• 循环语句。
if 语句的语法如下:
- if(condition_1)
- procedural_statement_1
- {else if(condition_2)
- procedural_statement_2}
- {else
- procedural_statement_3}
如果对 condition_1 求值的结果为一个非零值,那么 procedural_statement_1 被执行,
如果 condition_1 的值为 0、x 或 z,那么 procedural_statement_1 不执行。如果存在一个 else
分支,那么这个分支被执行。
下面是一个 if 语句的例子:
- if(Sum < 60)
- begin
- Grade = C;
- Total_C = Total_c + 1;
- end
- else if(Sum < 75)
- begin
- Grade = B;
- Total_B = Total_B + 1;
- end
- else
- begin
- Grade = A;
- Total_A = Total_A + 1;
- End
case 语句是一个多路条件分支形式,其语法如下:
- case(case_expr)
- case_item_expr{ ,case_item_expr} :procedural_statement
- . . .
- . . .
- [default:procedural_statement]
- endcase
case 语句首先对条件表达式 case_expr 求值,然后依次对各分支项求值并进行比较,第一个与条件表达式值相匹配的分支中的语句被执行。可以在 1 个分支中定义多个分支项,这些值不需要互斥。缺省分支覆盖所有没有被分支表达式覆盖的其他分支。下面是 case 语句的一个实例:
- always
- @ (A or B or OpCode)
- case (OpCode)
- ADD_INSTR: Z = A + B;
- SUB_INSTR: Z = A -B;
- MULT_INSTR: Z = A * B;
- DIV_INSTR: Z = A / B;
- endcase
- endmodule
Verilog HDL 中提供 4 种循环语句:forever 循环,repeat 循环,while 循环和 for 循环。forever 循环语句连续执行过程语句。因此为跳出这样的循环,中止语句可以与过程语句共同使用。同时,在过程语句中必须使用某种形式的时序控制,否则 forever 循环将在 0 延时后永远循环下去。forever 循环语句语法和实例如下:
- forever
- procedural_statement
- //实例
- initial
- begin
- Clock = 0;
- # 5 forever
- #10 Clock = ~Clock;
- end
这一实例产生时钟波形:时钟首先初始化为 0,并一直保持到第 5 个时间单位;此后每隔10 个时间单位,时钟反相一次。repeat 循环语句执行指定循环次数,如果循环计数表达式的值不确定,即为 x 或 z 时,那么循环次数按 0 处理。下面是 repeat 循环语句语法和实例如下:
- repeat(loop_count)
- procedural _ statement
- //实例
- repeat(Count)
- @ (posedge Clk) Sum = Sum + 1;//在时钟上升沿时每次加一
while 循环执行过程赋值语句直到指定的条件为假。如果表达式在开始时为假,那么过程语句便永远不会执行。如果条件表达式为 x 或 z,它也同样按 0(假)处理。下面时 while 循环的语法和实例:
- while(condition)
- procedural_statement
- //实例,一直执行直到 BY 小于等于 0
- while (BY > 0 )
- begin
- Acc = Acc << 1;
- By = By - 1;
- End
for 循环照指定的次数重复执行过程赋值语句。下面是 for 循环的语法和实例:
- for(initial_assignment ; condition ; step_assignment)
- procedural_statement
- //实例中,MAX_RANGE 为循环计次的上限,每次循环加一
- for (K=0 ; K < MAX_RANGE ; K = K + 1)
- begin
- if(Abus[K] == 0)
- Abus[K] = 1;
- else if(Abus[k] == 1)
- Abus[K] = 0;
- else
- $display( "Abus[K] is an x or a z");
- end
- end