下载 第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上产生的波形