夏宇闻教材3

发布时间 : 星期日 文章夏宇闻教材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;scani0) begin

$display(\memory[scani]=0; end

else /*WRONG*/

$display(\

尽管程序设计者把else写在与第一个if(外层if)同一列上,希望与第一个if对应,但实际上else是与第二个if对应,因为它们相距最近。正确的写法应当是这样的: if(index>0) begin

for(scani=0;scani0) begin

$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(表达式) endcase 2) casez(表达式) endcase 3) casex(表达式) endcase

case分支项的一般格式如下: 分支表达式: 语句 缺省项(default项): 语句 说明:

a) case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。

b) 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有的分支表达式的值都没有与控制表达式的值相匹配的,就执行default后面的语句。

c) default项可有可无,一个case语句里只准有一个default项。下面是一个简单的使用case语句的例子。该例子中对寄存器rega译码以确定result的值。

联系合同范文客服:xxxxx#qq.com(#替换为@)