发布时间 : 星期日 文章夏宇闻教材3更新完毕开始阅读
当一个块嵌入另一个块时,块的起始时间和结束时间是很重要的。至于跟在块后面的语句只有在该块的结束时间到了才能开始执行,也就是说,只有该块完全执行完后,后面的语句才可以执行。
在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。见下例:
[例5]:fork
#250 -> end_wave; #200 r = 'hF7; #150 r = 'h00; #100 r = 'hE2; #50 r = 'h35; join
在这个例子中,各条语句并不是按被执行的先后顺序给出的,但同样可以生成前面例子中的波形。
3.5.条件语句
3.5.1. if_else语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。Verilog HDL语言提供了三种形式的if语句。 (1).if(表达式)语句
例如: if ( a > b ) out1 <= int1; (2).if(表达式) 语句1 else 语句2
例如: if(a>b) out1<=int1; else out1<=int2; (3).if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; ........
else if(表达式m) 语句m; else 语句n;
例如:
if(a>b) out1<=int1;
else if(a==b) out1<=int2; else out1<=int3;
六点说明:
(1).三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。系统对表达式的值进行判断,若为0,x,z,按“假”处理,若为1,按“真”处理,执行指定的语句。
(2) .第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。 例如:
这是由于分号是Verilog HDL语句中不可缺少的部分,这个分号是if语句中的内嵌套语句所要求的。如果无此分号,则出现语法错误。但应注意,不要误认为上面是两个语句(if语句和else语句)。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
(3).在if和else后面可以包含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用begin和end这两个关键词将几个语句包含起来成为一个复合块语句。如: if(a>b) begin
out1<=int1; out2<=int2; end else begin
out1<=int2; out2<=int1; end
注意在end后不需要再加分号。因为begin_end内是一个完整的复合语句,不需再附加分号。
(4).允许一定形式的表达式简写方式。如下面的例子: if(expression) 等同与 if( expression == 1 ) if(!expression) 等同与 if( expression != 1 )
(5).if语句的嵌套
在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下: if(expression1)
if(expression2) 语句1 (内嵌if) else 语句2 else
if(expression3) 语句3 (内嵌if) else 语句4
应当注意if与else的配对关系,else总是与它上面的最近的if配对。如果if与else的数目不一样,为了实现程序设计者的企图,可以用begin_end块语句来确定配对关系。例如: if( )
begin
if( ) 语句1 (内嵌if) end else 语句2
这时begin_end块语句限定了内嵌if语句的范围,因此else与第一个if配对。注意begin_end块语句在if_else语句中的使用。因为有时begin_end块语句的不慎使用会改变逻辑行为。见下例: if(index>0)
for(scani=0;scani
$display(\memory[scani]=0; end
else /*WRONG*/
$display(\
尽管程序设计者把else写在与第一个if(外层if)同一列上,希望与第一个if对应,但实际上else是与第二个if对应,因为它们相距最近。正确的写法应当是这样的: if(index>0) begin
for(scani=0;scani
$display(\memory[scani]=0; end end
else /*WRONG*/
$display(\
(6).if_else例子。
下面的例子是取自某程序中的一部分。这部分程序用if_else语句来检测变量index以决定三个寄存器modify_segn中哪一个的值应当与index相加作为memory的寻址地址。并且将相加值存入寄存器index以备下次检测使用。程序的前十行定义寄存器和参数。
//定义寄存器和参数。
reg [31:0] instruction, segment_area[255:0]; reg [7:0] index;
reg [5:0] modify_seg1, modify_seg2, modify_seg3; parameter
segment1=0, inc_seg1=1,
segment2=20, inc_seg2=2, segment3=64, inc_seg3=4, data=128;
//检测寄存器index的值 if(index instruction = segment_area[index + modify_seg1]; index = index + inc_seg1; end else if(index instruction = segment_area[index + modify_seg2]; index = index + inc_seg2; end else if (index instruction = segment_area[index + modify_seg3]; index = index + inc_seg3; end else instruction = segment_area[index]; 3.5.2. case语句 case语句是一种多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择,Verilog语言提供的case语句直接处理多分支选择。case语句通常用于微处理器的指令译码,它的一般形式如下: 1) case(表达式) case分支项的一般格式如下: 分支表达式: 语句 缺省项(default项): 语句 说明: a) case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。 b) 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有的分支表达式的值都没有与控制表达式的值相匹配的,就执行default后面的语句。 c) default项可有可无,一个case语句里只准有一个default项。下面是一个简单的使用case语句的例子。该例子中对寄存器rega译码以确定result的值。