下载 第8章行为建模 在前几章中,我们已经介绍了使用门和UDP实例语句的门级建模方式,以及用连续赋值 语句的数据流建模方式。本章描述 Verilog hdl中的第三种建模方式,即行为建模方式。为充 分使用 Verilog HDL,一个模型可以包含所有上述三种建模方式。 8.1过程结构 下述两种语句是为一个设计的行为建模的主要机制 l) initial语句 2) al ways语句 一个模块中可以包含任意多个 initial或 always语句。这些语句相互并行执行,即这些语句 的执行顺序与其在模块中的顺序无关。一个 initial语句或 always语句的执行产生一个单独的控 制流,所有的 initial和 always语句在0时刻开始并行执行 81.1 initial语句 initial语句只执行一次 initial语句在模拟开始时执行,即在0时刻开始执行。 initial语句 的语法如下: in⊥t⊥a1 [timing control] procedural statement procedural statement是下列语句之 procedura1 assignment(b1 ocking or non-b1ock⊥d/阻塞或非阻塞性过程赋值语句// procedural continuous assignment conditional statement case statement 1o。 p statement wait statement d⊥sab1 e statement vent trigger sequential bloc parallel block task enable (user or system 顺序过程( begin.end)最常使用在进程语句中。这里的时序控制可以是时延控制,即等待 确定的时间:或事件控制,即等待确定的事件发生或某一特定的条件为真。 initial语句的 各个进程语句仅执行一次。注意 initial语句在模拟的0时刻开始执行。 initial语句根据进程语句 中出现的时间控制在以后的某个时间完成执行。 下面是inta语句实例 reg Yurt initial Yurt= 2
下载 第8章 行 为 建 模 在前几章中,我们已经介绍了使用门和 U D P实例语句的门级建模方式,以及用连续赋值 语句的数据流建模方式。本章描述 Verilog HDL中的第三种建模方式,即行为建模方式。为充 分使用Verilog HDL,一个模型可以包含所有上述三种建模方式。 8.1 过程结构 下述两种语句是为一个设计的行为建模的主要机制。 1) initial 语句 2) always语句 一个模块中可以包含任意多个 i n i t i a l或a l w a y s语句。这些语句相互并行执行,即这些语句 的执行顺序与其在模块中的顺序无关。一个 i n i t i a l语句或a l w a y s语句的执行产生一个单独的控 制流,所有的i n i t i a l和a l w a y s语句在0时刻开始并行执行。 8.1.1 initial 语句 initial 语句只执行一次。initial 语句在模拟开始时执行,即在 0时刻开始执行。initial 语句 的语法如下: i n i t i a l [t i m i n g _ c o n t r o l] p r o c e d u r a l _ s t a t e m e n t p r o c e d u r a l _ s t a t e m e n t是下列语句之一: p r o c e d u r a l _ a s s i g n m e n t(blocking or non-blocking) / /阻塞或非阻塞性过程赋值语句/ / p r o c e d u r a l _ c o n t i n u o u s _ a s s i g n m e n t c o n d i t i o n a l _ s t a t e m e n t c a s e _ s t a t e m e n t l o o p _ s t a t e m e n t w a i t _ s t a t e m e n t d i s a b l e _ s t a t e m e n t e v e n t _ t r i g g e r s e q u e n t i a l _ b l o c k p a r a l l e l _ b l o c k task_enable (user or system) 顺序过程( b e g i n . . . e n d )最常使用在进程语句中。这里的时序控制可以是时延控制,即等待 一个确定的时间;或事件控制,即等待确定的事件发生或某一特定的条件为真。 i n i t i a l语句的 各个进程语句仅执行一次。注意 i n i t i a l语句在模拟的0时刻开始执行。i n i t i a l语句根据进程语句 中出现的时间控制在以后的某个时间完成执行。 下面是i n i t i a l语句实例。 r e g Y u r t; . . . i n i t i a l Y u r t = 2;
60D)硬停插述语言 Chinaopub.com 下载 上述 initial语句中包含无时延控制的过程赋值语句。 initial语句在O时刻执行,促使Ynt在0 时刻被赋值为2。下例是一个带有时延控制的 initial语句 in⊥七⊥a1 寄存器变量Cwrt在时刻2被赋值为l。 initial语句在0时刻开始执行,在时刻2完成执行 下例为带有顺序过程的 initial语句 Parameter SIzE reg [7: 0] RAM [0: SIZE-l begin: SEO BLK A integer Index RibReg =0 for (Index = 0; Index SIZE: Index Index 1 RAM [Index 顺序过程由关键词 begin.end定界,它包含顺序执行的进程语句,与C语言等高级编程语 言相似。SEΩBLKA是顺序过程的标记;如果过程中没有局部说明部分,不要求这一标记。 例如,如果对 Index的说明部分在 initial语句之外,可不需要标记。整数型变量 Index已在过程 中声明。并且,顺序过程包含1个带循环语句的过程性赋值。这一 initial语句在执行时将所有 的内存初始化为0。 下例是另一个带有顺序过程的 initial语句。在此例中,顺序过程包含时延控制的过程性赋 值语句 //波形生成: parameter APPLY DELAY =5 reg[0: 7]port A begin APPLY DELAY Port在="hE APPLY DELAY Port年"h41 #APPLY DELAY Port Ah0A 执行时,PotA的值如图8-1所示 Port_A □1_m104 图8-1使用 initial语句产生的波形 如上面举例所示, Initial语句主要用于初始化和波形生成
上述i n i t i a l语句中包含无时延控制的过程赋值语句。 i n i t i a l语句在0时刻执行,促使Yu rt在0 时刻被赋值为2。下例是一个带有时延控制的 i n i t i a l语句。 r e g C u r t; . . . i n i t i a l #2 C u r t = 1; 寄存器变量C u rt在时刻2被赋值为1。i n i t i a l语句在0时刻开始执行,在时刻2完成执行。 下例为带有顺序过程的i n i t i a l语句。 p a r a m e t e r S I Z E = 1024; r e g [7:0] R A M [ 0 :S I Z E- 1 ] ; r e g R i b R e g; i n i t i a l b e g i n: S E Q _ B L K _ A i n t e g e r I n d e x; R i b R e g = 0; f o r (I n d e x = 0; I n d e x < S I Z E; I n d e x = I n d e x + 1) R A M [I n d e x] = 0; e n d 顺序过程由关键词 b e g i n . . . e n d定界,它包含顺序执行的进程语句,与 C语言等高级编程语 言相似。S E Q _ B L K _ A是顺序过程的标记;如果过程中没有局部说明部分,不要求这一标记。 例如,如果对I n d e x的说明部分在i n i t i a l语句之外,可不需要标记。整数型变量 I n d e x已在过程 中声明。并且,顺序过程包含 1个带循环语句的过程性赋值。这一 i n i t i a l语句在执行时将所有 的内存初始化为0。 下例是另一个带有顺序过程的 i n i t i a l语句。在此例中,顺序过程包含时延控制的过程性赋 值语句。 / /波形生成: p a r a m e t e r A P P L Y _ D E L A Y = 5; r e g[ 0 : 7 ]p o r t _ A; . . . i n i t i a l b e g i n P o r t _ A = ' h 2 0 ; #APPLY_DELAY Port_A= 'hF2; #APPLY_DELAY Port_A= 'h41; #APPLY_DELAY Port_A= 'h0A; e n d 执行时,P o rt _ A的值如图8 - 1所示。 图8-1 使用initial语句产生的波形 如上面举例所示,I n i t i a l语句主要用于初始化和波形生成。 60 Verilog HDL 硬件描述语言 下载
Chinapub.com 章行为建61 下载 812 always语句 与 initial语句相反, al ways语句重复执行。与 initial语句类似, always语句语法如下 always timing control] procedural statement 过程语句和时延控制(时序控制)的描述方式与上节相同。 例如 Clk =4 Clk //将无限循环 此 always语句有一个过程性赋值。因为 al ways语句重复执行,并且在此例中没有时延控制, 过程语句将在0时刻无限循环。因此, al ways语句的执行必须带有某种时序控制,如下例的 al ways语句,形式上与上面的实例相同,但带有时延控制 //产生时钟周期为10的波形 此 always语句执行时产生周期为10个时间单位的波形 下例是由事件控制的顺序过程的 al ways语句。 reg [0: 5] InstrRegi reg [3: 0] Accuma wire Executecycle e( Ececutecycle begin case(InstrReg[0: 1]) 2 b00: Store (Accum, InstrRe92: 5]) 2 'bll: Load (Accum, InstrReb2: 5]) 2'b0l: Jump (Ins trReg[2: 5]) 2"b10 endcase / store、Loac和Jump是在别处定义的用户自定义的任务 顺序过程( begin.end)中的语句按顺序执行。这个 always语句意味着只要有事件发生,即 只要发生变化, Execute Cycle就执行顺序过程中的语句;顺序过程的执行意味着按顺序执行过 程中的各个语句 下例为带异步预置的负边沿触发的D触发器的行为模型 module DFF(CIk, D, Set, o, obar input Clk, D, Set output o, obar reg a, bar always wait(Set ==1) begin
8.1.2 always语句 与i n i t i a l语句相反,a l w a y s语句重复执行。与i n i t i a l语句类似,a l w a y s语句语法如下: a l w a y s [t i m i n g _ c o n t r o l] p r o c e d u r a l _ s t a t e m e n t 过程语句和时延控制(时序控制)的描述方式与上节相同。 例如: always C l k = ~ C l k; / /将无限循环。 此a l w a y s语句有一个过程性赋值。因为a l w a y s语句重复执行,并且在此例中没有时延控制, 过程语句将在 0时刻无限循环。因此, a l w a y s语句的执行必须带有某种时序控制,如下例的 a l w a y s语句,形式上与上面的实例相同,但带有时延控制。 always #5 C l k = ~ C l k; / /产生时钟周期为1 0的波形。 此a l w a y s语句执行时产生周期为1 0个时间单位的波形。 下例是由事件控制的顺序过程的 a l w a y s语句。 r e g [0:5] I n s t r R e g; r e g [3:0] A c c u m; w i r e E x e c u t e C y c l e; a l w a y s @ (E c e c u t e C y c l e) b e g i n c a s e(I n s t r R e g[ 0 : 1 ] ) 2'b00: S t o r e (Accum, InstrReg[ 2 : 5 ] ) ; 2'b11: L o a d (Accum, InstrReg[ 2 : 5 ] ) ; 2'b01: J u m p (I n s t r R e g[ 2 : 5 ] ) ; 2 ' b 1 0 : ; e n d c a s e e n d / /S t o r e、L o a d和J u m p是 在别处定义的用户自定义的任务。 顺序过程( b e g i n . . . e n d )中的语句按顺序执行。这个 a l w a y s语句意味着只要有事件发生,即 只要发生变化,E x e c u t e C y c l e就执行顺序过程中的语句;顺序过程的执行意味着按顺序执行过 程中的各个语句。 下例为带异步预置的负边沿触发的 D触发器的行为模型。 m o d u l e D F F(Clk, D, Set, Q, Qbar) ; i n p u t Clk, D, Set; o u t p u t Q, Qbar; r e g Q, Qbar; a l w a y s w a i t (S e t == 1) b e g i n #3 Q = 1; #2 Q b a r = 0; 第8章 行 为 建 模 61 下载
62 Verilog hdl硬件描述语言 Chia°dcow 下载 wait(Set == 0) @(negedge Cik begin if(Set begin #5Q end end endmodule 此模型中有2条 al ways语句。第一条 always语句中顺序过程的执行由电平敏感事件控制。 第二条 always语句中顺序过程的执行由边沿触发的事件控制 8.1.3两类语句在模块中的使用 个模块可以包含多条 always语句和多条 initial语句。每条语句启动一个单独的控制流 各语句在0时刻开始并行执行 下例中含有1条 initial语句和2条 al ways语句 module TestxorBehavior reg sa, sb, Zeus ⊥nit⊥a1 begin Sb=0; #5Sb=1 5Sb=0 e(Sa or sb) zeus =s always Display ("At time st, sa d, sb =d, eus =ab". stime, Sa, Sb, Zeus) endmodule 模块中的3条语句并行执行,其在模块中的书写次序并不重要。 initial语句执行时促使顺 序过程中的第一条语句执行,即Sa赋值为0;下一条语句在0时延后立即执行。 initial语句中的 第3行表示“等待5个时间单位”。这样Sb在5个时间单位后被赋值为1,Sa在另外5个时间单位 后被赋值为0。执行顺序过程最后一条语句后, initial语句被永远挂起 第一条 always语句等待Sa或Sb上的事件发生。只要有事件发生,就执行 always语句内的语 句,然后 always语句重新等待发生在Sa或Sb上的事件。注意根据 initial语句对Sa和Sb的赋值, al ways语句将在第0、5、10和15个时间单位时执行
w a i t (S e t == 0); e n d a l w a y s @ (n e g e d g e C l k) b e g i n if (S e t != 1) b e g i n #5 Q = D; #1 Q b a r = ~ Q; e n d e n d e n d m o d u l e 此模型中有 2条a l w a y s语句。第一条 a l w a y s语句中顺序过程的执行由电平敏感事件控制。 第二条a l w a y s语句中顺序过程的执行由边沿触发的事件控制。 8.1.3 两类语句在模块中的使用 一个模块可以包含多条 a l w a y s语句和多条i n i t i a l语句。每条语句启动一个单独的控制流。 各语句在0时刻开始并行执行。 下例中含有1条i n i t i a l语句和2条a l w a y s语句。 m o d u l e T e s t X o r B e h a v i o r; r e g Sa, Sb, Zeus; i n i t i a l b e g i n S a = 0; S b = 0; #5 S b = 1; #5 S a = 1; #5 S b = 0; e n d a l w a y s @ (Sa or Sb) Zeus = Sa ^ Sb; a l w a y s @ (Z e u s) $d i s p l a y ( "At time %t, S a = %d, S b = %d, Z e u s = %b", $t i m e, S a, S b, Z e u s) ; e n d m o d u l e 模块中的3条语句并行执行,其在模块中的书写次序并不重要。 i n i t i a l语句执行时促使顺 序过程中的第一条语句执行,即 S a赋值为0;下一条语句在0时延后立即执行。i n i t i a l语句中的 第3行表示“等待5个时间单位”。这样S b在5个时间单位后被赋值为 1,S a在另外5个时间单位 后被赋值为0。执行顺序过程最后一条语句后, i n i t i a l语句被永远挂起。 第一条a l w a y s语句等待S a或S b上的事件发生。只要有事件发生,就执行 a l w a y s语句内的语 句,然后a l w a y s语句重新等待发生在 S a或S b上的事件。注意根据 i n i t i a l语句对S a和S b的赋值, a l w a y s语句将在第0、5、1 0和1 5个时间单位时执行。 62 Verilog HDL 硬件描述语言 下载
chinapub.com )行为建颇63 下载 同样,只要有事件发生在Zes上,就执行第2条 always语 句。在这种情况下,系统任务 Display被执行,然后 always 语句重新等待发生在Zeus上的事件。Sa、Sb和zes上产生的 波形如图8-2所示。下面是模块模拟运行产生的输出 在时刻 a=0 sb=1, zeus =1 在时刻 1, Zeus =0 在时刻 图8-2Sa、Sb和Zes上产生的波形 82时序控制 时序控制与过程语句关联。有2种时序控制形式 1)时延控制 2)事件控制 8.21时延控制 时延控制形式如下 delay procedural statement 实例如下 #2 TX Rx-5 时延控制定义为执行过程中首次遇到该语句与该语句的执行的时间间隔。时延控制表示 在语句执行前的“等待时延”。上面的例子中,过程赋值语句在碰到该语句后的2个时间单位 执行,然后执行赋值。 另一实例如下: initial beG⊥n #3 wave b0111 #7 wave ='b0000 end initial语句在0时刻执行。首先,等待3个时间单位执行第一个赋值,然后等待6个时间单 位,执行第2个语句:再等待7个时间单位,执行第3个语句:然后永远挂起。 时延控制也可以用另一种形式定义 这一语句促使在下一条语句执行前等待给定的时延。下面是这种用法的实例。 parameter ON DELAY = 3, OFF DELAY=5 # ON DELAY;//等待 ON DELAY规定的时延。 Refclk =0 OFF DELAY;//等待 OFF DELAY规定的时延。 end 时延控制中的时延可以是任意表达式,即不必限定为某一常量,见下面的例子 g strobe Compare Tx ask
同样,只要有事件发生在Z e u s上,就执行第2条a l w a y s语 句。在这种情况下,系统任务 $ d i s p l a y被执行,然后 a l w a y s 语句重新等待发生在 Z e u s上的事件。S a、S b和Z e u s上产生的 波形如图8 - 2所示。下面是模块模拟运行产生的输出。 在时刻 5, Sa = 0, Sb = 1, Zeus = 1 在时刻 10, Sa = 1, Sb = 1, Zeus = 0 在时刻 15, Sa = 1, Sb = 0, Zeus = 1 8.2 时序控制 时序控制与过程语句关联。有 2种时序控制形式: 1) 时延控制 2) 事件控制 8.2.1 时延控制 时延控制形式如下: #delay procedural_statement 实例如下; #2 Tx = R x- 5 ; 时延控制定义为执行过程中首次遇到该语句与该语句的执行的时间间隔。时延控制表示 在语句执行前的“等待时延”。上面的例子中,过程赋值语句在碰到该语句后的 2个时间单位 执行,然后执行赋值。 另一实例如下: i n i t i a l b e g i n #3 W a v e = 'b0111; #6 W a v e = 'b1100; #7 W a v e = 'b0000; e n d i n i t i a l语句在0时刻执行。首先,等待 3个时间单位执行第一个赋值,然后等待 6个时间单 位,执行第2个语句;再等待7个时间单位,执行第3个语句;然后永远挂起。 时延控制也可以用另一种形式定义: #d e l a y; 这一语句促使在下一条语句执行前等待给定的时延。下面是这种用法的实例。 parameter O N _ D E L A Y = 3, O F F _ D E L A Y = 5; a l w a y s b e g i n # O N _ D E L A Y; //等待O N _ D E L A Y规定的时延。 R e f C l k = 0; # O F F _ D E L A Y; //等待O F F _ D E L A Y规定的时延。 R e f C l k = 1; e n d 时延控制中的时延可以是任意表达式,即不必限定为某一常量,见下面的例子。 # Strobe Compare = TX^a s k ; 第8章 行 为 建 模 63 下载 图8-2 Sa、Sb和Zeus上产生的波形
64 Verilog hdl硬件描述语言 Chinapub. coM 下载 普( PERIOD/2) c1。ck=~c1ock 如果时延表达式的值为0,则称之为显式零时延。 显式零时延促发一个等待,等待所有其它在当前模拟时间被执行的事件执行完毕后,才 将其唤醒:模拟时间不前进。 如果时延表达式的值为x或z,其与零时延等效。如果时延表达式计算结果为负值,那么其 进制的补码值被作为时延,这一点在使用时务请注意 822事件控制 在事件控制中, al ways的过程语句基于事件执行。有两种类型的事件控制方式: 1)边沿触发事件控制 2)电平敏感事件控制 1.边沿触发事件控制 边沿触发事件控制如下 a event procedural statement 如下例所示 Curr state Next state 带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果 Clock信号从低 电平变为高电平(正沿),就执行赋值语句:否则进程被挂起直到 Clock信号产生下一个正跳边沿。 下面是进一步的实例。 g(negedge Reset) Count =0 在第一条语句中,赋值语句只在 Reset上的负沿执行。第二条语句中,当Cla上有事件发生 时,Foo的值被赋给Zoo,即等待Cla上发生事件:当Cl的值发生变化时,Foo的值被赋给Zoo 也可使用如下形式 该语句促发一个等待,直到指定的事件发生。下面是确定时钟在周期的 initia语句中使用 的一个例子。 time Riseedge, On De lay ⊥n⊥tia1 begin /等待,直到在时钟上发生正边沿: e(posedge ClockA)i /等待,直到在时钟上发生负边沿: e(negedge Clock)i OnDelay stime -RiseEdgei q display ("The on-period of clock is st. Delay 事件之间也能够相或以表明“如果有任何事件发生”。下例将对此进行说明 e(posedge Clear or negedge Reset
#(P E R I O D / 2) Clock = ~C l o c k 如果时延表达式的值为0,则称之为显式零时延。 #0; //显式零时延。 显式零时延促发一个等待,等待所有其它在当前模拟时间被执行的事件执行完毕后,才 将其唤醒;模拟时间不前进。 如果时延表达式的值为 x或z,其与零时延等效。如果时延表达式计算结果为负值,那么其 二进制的补码值被作为时延,这一点在使用时务请注意。 8.2.2 事件控制 在事件控制中,a l w a y s的过程语句基于事件执行。有两种类型的事件控制方式: 1) 边沿触发事件控制 2) 电平敏感事件控制 1. 边沿触发事件控制 边沿触发事件控制如下: @ event procedural_statement 如下例所示: @ (p o s e d g e C l o c k) C u r r _ S t a t e = N e x t _ S t a t e; 带有事件控制的进程或过程语句的执行,须等到指定事件发生。上例中,如果C l o c k信号从低 电平变为高电平(正沿),就执行赋值语句;否则进程被挂起,直到C l o c k信号产生下一个正跳边沿。 下面是进一步的实例。 @ (n e g e d g e R e s e t) C o u n t = 0; @C l a Z o o = F o o; 在第一条语句中,赋值语句只在 R e s e t上的负沿执行。第二条语句中 ,当C l a上有事件发生 时,F o o的值被赋给Z o o,即等待C l a上发生事件;当C l a的值发生变化时,F o o的值被赋给Z o o。 也可使用如下形式: @ e v e n t ; 该语句促发一个等待,直到指定的事件发生。下面是确定时钟在周期的 i n i t i a l语句中使用 的一个例子。 t i m e RiseEdge, OnDelay; i n i t i a l b e g i n / /等待,直到在时钟上发生正边沿: @ (p o s e d g e C l o c k A) ; R i s e E d g e = $t i m e; / /等待,直到在时钟上发生负边沿: @ (n e g e d g e C l o c k A) ; O n D e l a y = $t i m e - R i s e E d g e; $d i s p l a y ("The on-period of clock is %t.", D e l a y) ; e n d 事件之间也能够相或以表明“如果有任何事件发生”。下例将对此进行说明。 @ (p o s e d g e C l e a r or negedge R e s e t) 64 Verilog HDL 硬件描述语言 下载
Chinaopub.com )行为建颇65 下载 e(ctrl A or Ctrl B) 注意关键字or并不意味着在1个表达式中的逻辑或 在 Verilog HDL中 posedge和 negedge是表示正沿和负沿的关键字。信号的负沿是下述转换 正沿是下述转换的一种 0->x 0->1 2.电平敏感事件控制 在电平敏感事件控制中,进程语句或进程中的过程语句一直延迟到条件变为真后才执行 电平敏感事件控制以如下形式给出: wait ( Condition) procedural statement 过程语句只有在条件为真时才执行,否则过程语句一直等待到条件为真。如果执行到该 语句时条件已经为真,那么过程语句立即执行。在上面的表示形式中,过程语句是可选的。 wait (Sum > 22) wait (Da thReady wait (Preset 在第一条语句中,只有当SWm的值大于22时,才对Sum清0。在第二条语句中,只有当 Dataread为真,即 DataReady值为1时,将Bas赋给Daa。最后一条语句表示延迟至 Preset变 为真(值为1)时,其后续语句方可继续执行 83语句块 语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在 Verilog HDL中有两类语句块,即: 1)顺序语句块( begin.end):语句块中的语句按给定次序顺序执行。 2)并行语句块( fork.join):语句块中的语句并行执行。 语句块的标识符是可选的,如果有标识符,寄存器变量可在语句块内部声明。带标识符 的语句块可被引用:例如,语句块可使用禁止语句来禁止执行。此外,语句块标识符提供l 标识寄存器的一种方式。但是,要注意所有的寄存器均是静态的,即它们的值在整个模拟
Q = 0; @ (Ctrl_A o r C t r l _ B) D b u s = 'b z; 注意关键字o r并不意味着在1个表达式中的逻辑或。 在Verilog HDL中p o s e d g e和n e g e d g e是表示正沿和负沿的关键字。信号的负沿是下述转换 的一种: 1 -> x 1 -> z 1 -> 0 x -> 0 z -> 0 正沿是下述转换的一种: 0 -> x 0 -> z 0 -> 1 x -> 1 z -> 1 2. 电平敏感事件控制 在电平敏感事件控制中,进程语句或进程中的过程语句一直延迟到条件变为真后才执行。 电平敏感事件控制以如下形式给出: w a i t (C o n d i t i o n) p r o c e d u r a l _ s t a t e m e n t 过程语句只有在条件为真时才执行,否则过程语句一直等待到条件为真。如果执行到该 语句时条件已经为真,那么过程语句立即执行。在上面的表示形式中,过程语句是可选的。 例如: w a i t (S u m > 22) S u m = 0; w a i t (D a t a R e a d y) D a t a = B u s; w a i t (P r e s e t) ; 在第一条语句中,只有当 S u m的值大于 2 2时,才对 S u m清0。在第二条语句中,只有当 D a t a R e a d y为真,即D a t a R e a d y值为1时,将B u s赋给D a t a。最后一条语句表示延迟至 P re s e t变 为真(值为1)时,其后续语句方可继续执行。 8.3 语句块 语句块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制。在 Ve r i l o g H D L中有两类语句块,即: 1) 顺序语句块(b e g i n . . . e n d):语句块中的语句按给定次序顺序执行。 2) 并行语句块(f o r k . . . j o i n):语句块中的语句并行执行。 语句块的标识符是可选的,如果有标识符,寄存器变量可在语句块内部声明。带标识符 的语句块可被引用;例如,语句块可使用禁止语句来禁止执行。此外,语句块标识符提供唯 一标识寄存器的一种方式。但是,要注意所有的寄存器均是静态的,即它们的值在整个模拟 第8章 行 为 建 模 65 下载
66wmD硬件描述语言 下载 运行中不变 831顺序语句块 顺序语句块中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟 时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。顺序语 句块的语法如下: begin [ block id(declarations) procedural sta 例如: //产生波形 begin #2 stream = l #3 Stream =1 #4 Stream =0 #2 Stream= 1: #5 Stream = 0: 假定顺序语句块在第10个时间单位开始执行。两个时间单位后第1条语句执行,即第12个 时间单位。此执行完成后,下1条语句在第17个时间单位执行(延迟5个时间单位)。然后下1条 语句在第20个时间单位执行,以此类推。该顺序语句块执行过程中产生的波形如图8-3所示 Stream 图8-3顺序语句块中的累积时延 下面是顺序过程的另一实例。 gin t Mask I Mat @(negedge Clk)i F=& Pat 在该例中,第1条语句首先执行,然后执行第2条语句。当然,第2条语句中的赋值只有在 Clk上出现负沿时才执行。下面是顺序过程的另一实例 EO BLK reg [0: 3; Sat Mask s Dat end 在这一实例中,顺序语句块带有标记 SEO BLK,并且有一个局部寄存器说明。在执行时, 首先执行第1条语句,然后执行第2条语句
运行中不变。 8.3.1 顺序语句块 顺序语句块中的语句按顺序方式执行。每条语句中的时延值与其前面的语句执行的模拟 时间相关。一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。顺序语 句块的语法如下: b e g i n [ :b l o c k _ i d{d e c l a r a t i o n s} ] p r o c e d u r a l _ s t a t e m e n t ( s ) e n d 例如: / /产生波形: b e g i n #2 S t r e a m = 1; #5 S t r e a m = 0; #3 S t r e a m = 1; #4 S t r e a m = 0; #2 S t r e a m = 1; #5 S t r e a m = 0; e n d 假定顺序语句块在第1 0个时间单位开始执行。两个时间单位后第 1条语句执行,即第1 2个 时间单位。此执行完成后,下 1条语句在第1 7个时间单位执行 (延迟5个时间单位)。然后下1条 语句在第2 0个时间单位执行,以此类推。该顺序语句块执行过程中产生的波形如图 8 - 3所示。 图8-3 顺序语句块中的累积时延 下面是顺序过程的另一实例。 b e g i n P a t = M a s k | M a t; @ (n e g e d g e C l k) ; F F = & P a t e n d 在该例中,第1条语句首先执行,然后执行第 2条语句。当然,第2条语句中的赋值只有在 C l k上出现负沿时才执行。下面是顺序过程的另一实例。 b e g i n: S E Q _ B L K r e g[0:3] S a t ; S a t = Mask & Data; F F = ^S a t; e n d 在这一实例中,顺序语句块带有标记 S E Q _ B L K,并且有一个局部寄存器说明。在执行时, 首先执行第1条语句,然后执行第 2条语句。 66 Verilog HDL 硬件描述语言 下载
Chinaopub coM 章行为建67 下载 32并行语句块 并行语句块带有定界符fork和join(顺序语句块带有定界符 begin和end),并行语句块中的 各语句并行执行。并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关 当并行语句块中最后的动作执行完成时(最后的动作并不一定是最后的语句),顺序语句块的语 句继续执行。换一种说法就是并行语句块内的所有语句必须在控制转出语句块前完成执行 并行语句块语法如下 [ block id( declarations] procedural statement(s)i oin 例如 //生成波形: fork #2 Stream= 1 #7 Stream =0 #10 Stream= 1: #14 Stream 0 stream 0 j。in 如果并行语句块在第10个时间单位开始执行,所有的语句并行执行并且所有的时延都是 相对于时刻10的。例如,第3个赋值在第20个时间单位执行,并在第26个时间单位执行第5个 赋值,以此类推。其产生的波形如图8-4所示 图8-4并行语句块中的相对时延 下例混合使用了顺序语句块和并行语句块,以强调两者的不同之处 always begin: SEQ A f。rk:PARA #6cun=7; //P1 begin: SEQ B //P2 EXE BOX: //s6 end 2Dp=3 //P3 //P4 //P5 j。in
8.3.2 并行语句块 并行语句块带有定界符 f o r k和j o i n(顺序语句块带有定界符 b e g i n和e n d),并行语句块中的 各语句并行执行。并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关。 当并行语句块中最后的动作执行完成时 (最后的动作并不一定是最后的语句 ),顺序语句块的语 句继续执行。换一种说法就是并行语句块内的所有语句必须在控制转出语句块前完成执行。 并行语句块语法如下: f o r k [ :b l o c k _ i d{d e c l a r a t i o n s} ] p r o c e d u r a l _ s t a t e m e n t(s) ; j o i n 例如: // 生成波形: f o r k #2 S t r e a m = 1; #7 S t r e a m = 0; #10 S t r e a m = 1; #14 S t r e a m = 0; #16 S t r e a m = 1; #21 S t r e a m = 0; j o i n 如果并行语句块在第 1 0个时间单位开始执行,所有的语句并行执行并且所有的时延都是 相对于时刻1 0的。例如,第3个赋值在第2 0个时间单位执行,并在第 2 6个时间单位执行第 5个 赋值,以此类推。其产生的波形如图 8 - 4所示。 图8-4 并行语句块中的相对时延 下例混合使用了顺序语句块和并行语句块,以强调两者的不同之处。 a l w a y s b e g i n:S E Q _ A #4 D r y = 5; // S1 f o r k: P A R _ A / / S 2 #6 C u n = 7; //P1 b e g i n: S E Q _ B / / P 2 E X E = B o x; //S6 #5 J a p = E x e; //S7 e n d #2 D o p = 3; //P3 #4 G o s = 2; //P4 #8 P a s = 4; //P5 j o i n 第8章 行 为 建 模 67 下载
68cD)硬停插述语言 下载 #8Bax=1; //s3 #2Z0m=52 #6 ssto //s5 always语句中包含顺序语句块SEQ_A,并且顺序语句块内的所有语句(S1、S2、S3、S4和 S5)顺序执行。因为 always语句在0时刻执行,Dny在第4个时间单位被赋值为5,并且并行语句 块PAR_A在第4个时间单位开始执行。并行语句块中的所有语句(P1、P2、P3、P4和P5)在第4 个时间单位并行执行。这样CⅧm在第10个时间单位被赋值,Dop在第6个时间单位被赋值,Gos 在第8个时间单位被赋值,Pas在第12个时间单位被赋值。顺序语句块SEQ_B在第4个时间单位 开始执行,并导致该顺序块中的语句S6、S7依次被执行;Jp在时间单位9被赋于新值。因为 并行语句块PARA中的所有语句在第12个时间单位完成执行,语句S3在第12个时间单位被执 行,在第20个时间单位Bax被赋值,然后语句S4执行,在第22个时间单位Zom被赋值,然后 执行下一语句。最终在第28个时间单位执行系统任务 Sstop. al ways语句执行时发生的事件如 图8-5所示。 Gos= 2 Dry=5 Ssto Bax = l |22 Zoom =52 图8-5顺序语句块和并行语句块混合使用时的时延 8.4过程性赋值 过程性赋值是在 initial语句或 always语句内的赋值,它只能对寄存器数据类型的变量赋值 表达式的右端可以是任何表达式。例如: reg[l: 4] Enable,A, B: #5 Enable +A +B Enable为寄存器。根据时延控制,赋值语句被延迟5个时间单位执行。右端表达式被计算 并赋值给 Enable 过程性赋值与其周围的语句顺序执行。 always语句实例如下 a⊥ways 8(A。 r B or C。rD) begin: AOI reg Templ, Temp2;
#8 B a x = 1; //S3 #2 Z o o m = 52; //S4 #6 $s t o p; //S5 e n d a l w a y s语句中包含顺序语句块 S E Q_A,并且顺序语句块内的所有语句 ( S 1、S 2、S 3、S 4和 S 5 )顺序执行。因为a l w a y s语句在0时刻执行,D ry在第4个时间单位被赋值为5,并且并行语句 块PA R _ A在第4个时间单位开始执行。并行语句块中的所有语句 ( P 1、P 2、P 3、P 4和P 5 )在第4 个时间单位并行执行。这样 C u n在第1 0个时间单位被赋值,D o p在第6个时间单位被赋值,G o s 在第8个时间单位被赋值,P a s在第1 2个时间单位被赋值。顺序语句块 S E Q _ B在第4个时间单位 开始执行,并导致该顺序块中的语句 S 6、S 7依次被执行;J a p在时间单位9被赋于新值。因为 并行语句块PA R _ A中的所有语句在第 1 2个时间单位完成执行,语句 S 3在第1 2个时间单位被执 行,在第2 0个时间单位B a x被赋值,然后语句 S 4执行,在第2 2个时间单位Z o o m被赋值,然后 执行下一语句。最终在第 2 8个时间单位执行系统任务 $ s t o p。a l w a y s语句执行时发生的事件如 图8 - 5所示。 图8-5 顺序语句块和并行语句块混合使用时的时延 8.4 过程性赋值 过程性赋值是在i n i t i a l语句或a l w a y s语句内的赋值,它只能对寄存器数据类型的变量赋值。 表达式的右端可以是任何表达式。例如: r e g[1:4] E n a b l e , A , B; . . . #5 E n a b l e = ~A ^ ~B; E n a b l e为寄存器。根据时延控制,赋值语句被延迟 5个时间单位执行。右端表达式被计算, 并赋值给E n a b l e。 过程性赋值与其周围的语句顺序执行。 a l w a y s语句实例如下: a l w a y s @ (A o r B o r C o r D) b e g i n:A O I r e g T e m p 1 , T e m p 2; Temp1 = A & B; Temp2 = C & D; Temp1 = Temp1 | T e m p 2 ; 68 Verilog HDL 硬件描述语言 下载