Chinaopub.com 下载 第10章其他论题 本章讲述诸如函数、任务、层次结构、值变转储文件和编译程序指令等多种论题。 10.1任务 个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用 任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以 包含时序控制,即时延控制,并且任务也能调用其它任务和函数。 10.1.1任务定义 任务定义的形式如下 task task id: declarat⊥ons] procedural statement endtask 任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数 从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义 在模块说明部分中编写。例如: arameter MAXBITS =8 task Reverse bits input [MAXBITS-1: 0] Din output [MAXBITS-1: 0]Dout begin for (K=0; K< MAXBITS: K=K+1) Dout [MAXBIT'S-K]= Din[K] end edtas endmodule 任务的输入和输出在任务开始处声明。这些输入和输出的顺序决定了它们在任务调用中 的顺序。下面是另一个例子 task Rotate left inout [1: 16] In Arr nput [0: 3] start Bit, stop Bit, Rotate By: integer MacI, Mac3 begin
下载 第10章 其 他 论 题 本章讲述诸如函数、任务、层次结构、值变转储文件和编译程序指令等多种论题。 10.1 任务 一个任务就像一个过程,它可以从描述的不同位置执行共同的代码段。共同的代码段用 任务定义编写成任务,这样它就能够从设计描述的不同位置通过任务调用被调用。任务可以 包含时序控制,即时延控制,并且任务也能调用其它任务和函数。 10.1.1 任务定义 任务定义的形式如下: t a s k t a s 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 e n d t a s k 任务可以没有或有一个或多个参数。值通过参数传入和传出任务。除输入参数外(参数 从任务中接收值),任务还能带有输出参数(从任务中返回值)和输入输出参数。任务的定义 在模块说明部分中编写。例如: m o d u l e H a s _ T a s k; p a r a m e t e r MAXBITS = 8; t a s k R e v e r s e _ B i t s; i n p u t [MAXBITS -1:0] D i n; o u t p u t [MAXBITS -1:0] D o u t; i n t e g e r K; b e g i n f o r (K = 0; K < M A X B I T S; K = K + 1) D o u t [M A X B I T S-K] = D i n[K] ; e n d e n d t a s k . . . e n d m o d u l e 任务的输入和输出在任务开始处声明。这些输入和输出的顺序决定了它们在任务调用中 的顺序。下面是另一个例子 : t a s k R o t a t e _ L e f t; i n o u t [1:16] I n _ A r r; i n p u t [0:3] S t a r t _ B i t,S t o p _ B i t,R o t a t e _ B y; r e g F i l l _ V a l u e; i n t e g e r M a c 1,M a c 3; b e g i n
92wmD硬件述语言 Chia°bu6eM 下载 Rotate By: Mac3= Mac3+ 1) begin Fill Value= In Arr[stop Bit for (Macl= Stop Bit: Macl > Start Bit +l In Arr [Macl]= In Arr [Macl -1 In Arr[Start Bit]= Fill Value; endtask Fill value是任务的局部寄存器,只能在任务中直接可见。任务的第1个参数是输入输出数 组InAr,随后是3个输入, Start bit、 Stop Bit和 Rotate By 除任务参数外,任务还能够引用说明任务的模块中定义的任何变量。在下一节将举例说 明这种情况 10.12任务调用 个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量 值。任务调用语句是过程性语句,可以在 always语句或 initial语句中使用。形式如下 xpr2,.,exprN) 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹 配。此外,参数要按值传递,不能按地址传递。在其它高级编程语言中,例如 Pascal,任务与 过程的一个重要区别是任务能够被并发地调用多次,并且每次调用能带有自己的控制,最重 要的一点是在任务中声明的变量是静态的,即它决不会消失或重新被初始化。因此一个任务 调用能够修改被其他任务调用读取的局部变量的值 下面是调用任务 Reverse Bits的实例,该任务定义已在前面章节中给出, //寄存器说明部分: reg [MAXBITS-1: 0] Reg x, New Reg Reverse Bits(Reg x, New Reg) /狂务调用。 Reg_X的值作为输入值传递,即传递给Din。任务的输出Dot返回到New_Reg。注意因为 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值 因为任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器 类型的。在上面的例子中, New Reg必须被声明为寄存器类型 下面的例子不通过参数表向任务调用传入变量。尽管引用全局变量被认为是不良的编程 风格,它有时却非常有用。 module Global var RamQ[0:63] reg CheckB⊥t; task GetParityi output paritybit
f o r (M a c 3 = 1; Mac3 = S t a r t _ B i t + 1; M a c 1 = M a c 1 - 1 ) I n _ A r r[M a c 1] = I n _ A r r [M a c 1 - 1]; I n _ A r r[S t a r t _ B i t] = F i l l _ V a l u e; e n d e n d e n d t a s k F i l l _ Va l u e是任务的局部寄存器,只能在任务中直接可见。任务的第 1个参数是输入输出数 组I n _ A rr,随后是3个输入,S t a rt _ B i t、S t o p _ B i t和R o t a t e _ B y。 除任务参数外,任务还能够引用说明任务的模块中定义的任何变量。在下一节将举例说 明这种情况。 10.1.2 任务调用 一个任务由任务调用语句调用。任务调用语句给出传入任务的参数值和接收结果的变量 值。任务调用语句是过程性语句,可以在 always 语句或initial 语句中使用。形式如下: t a s k _ i d [ (e x p r 1 , e x p r 2 , . . . , e x p r N) ] ; 任务调用语句中参数列表必须与任务定义中的输入、输出和输入输出参数说明的顺序匹 配。此外,参数要按值传递,不能按地址传递。在其它高级编程语言中,例如 P a s c a l,任务与 过程的一个重要区别是任务能够被并发地调用多次,并且每次调用能带有自己的控制,最重 要的一点是在任务中声明的变量是静态的,即它决不会消失或重新被初始化。因此一个任务 调用能够修改被其他任务调用读取的局部变量的值。 下面是调用任务R e v e r s e _ B i t s的实例,该任务定义已在前面章节中给出, / /寄存器说明部分: r e g [M A X B I T S-1:0] R e g _ X , N e w _ R e g; R e v e r s e _ B i t s(R e g _ X , N e w _ R e g); //任务调用。 R e g _ X的值作为输入值传递,即传递给 D i n。任务的输出D o u t返回到N e w _ R e g。注意因为 任务能够包含定时控制,任务可在被调用后再经过一定时延才返回值。 因为任务调用语句是过程性语句,所以任务调用中的输出和输入输出参数必须是寄存器 类型的。在上面的例子中, N e w _ R e g必须被声明为寄存器类型。 下面的例子不通过参数表向任务调用传入变量。尽管引用全局变量被认为是不良的编程 风格,它有时却非常有用。 m o d u l e G l o b a l _ V a r; reg [0:7] R a m Q [ 0 : 6 3 ] ; i n t e g e r I n d e x; r e g C h e c k B i t; t a s k G e t P a r i t y; i n p u t A d d r e s s; o u t p u t P a r i t y B i t; 92 Verilog HDL 硬件描述语言 下载
Chinaopub.com 第0章其他论93 载 ParityBit = Ramo[ Address] edtas ⊥n⊥七ia ex 63: Index Index+ 1)begin GetParity( Index, CheckBit)i Sdisplay("Parity bit of memory word sd is sb.", Checke⊥y; module 存储器RamQ的地址被作为参数传递,而存储器本身在任务内直接引用 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时 才传递给调用参数。例如: modu1 e tasha⊥t reg Noclock task Genera tewaveform: output Clocko begin #2cI。ckQ=0 排2 Clocko=1; #2 Clocko=0 endtask initial Genaratewaveform (NoClock); endmodule 任务 Generate Waveform对 Clocko的赋值不出现在 NoClock上,即没有波形出现在 NoClock 上;只有对 Clocko的最终赋值0在任务返回后出现在 NoClock上。为避免这一情形出现,最好 将 Clocko声明为全局寄存器类型,即在任务之外声明它。 10.2函数 函数,如同任务一样,也可以在模块不同位置执行共同代码。函数与任务的不同之处是 函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其 它的任务。此外,函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函 数可以调用其它的函数。 10.21函数说明部分 函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定,形式 如下 function [ range] function id: ⊥ nput dec1 aration other declarations procedural statement endfunction
P a r i t y B i t = ^R a m Q[A d d r e s s] ; e n d t a s k i n i t i a l f o r (I n d e x = 0; I n d e x <= 63; I n d e x = I n d e x+ 1 )b e g i n G e t P a r i t y(I n d e x , C h e c k B i t) ; $d i s p l a y("Parity bit of memory word %d is %b.", Index, CheckBit) ; e n d e n d m o d u l e 存储器R a m Q的地址被作为参数传递,而存储器本身在任务内直接引用。 任务可以带有时序控制,或等待特定事件的发生。但是,输出参数的值直到任务退出时 才传递给调用参数。例如: m o d u l e T a s k W a i t; r e g N o C l o c k; t a s k G e n e r a t e W a v e f o r m; o u t p u t C l o c k Q; b e g i n C l o c k Q = 1; #2 C l o c k Q = 0; #2 C l o c k Q = 1; #2 C l o c k Q = 0; e n d e n d t a s k i n i t i a l G e n a r a t e W a v e f o r m (N o C l o c k) ; e n d m o d u l e 任务G e n e r a t e Wa v e f o r m对C l o c k Q的赋值不出现在N o C l o c k上,即没有波形出现在 N o C l o c k 上;只有对C l o c k Q的最终赋值0在任务返回后出现在 N o C l o c k上。为避免这一情形出现,最好 将C l o c k Q声明为全局寄存器类型,即在任务之外声明它。 10.2 函数 函数,如同任务一样,也可以在模块不同位置执行共同代码。函数与任务的不同之处是 函数只能返回一个值,它不能包含任何时延或时序控制(必须立即执行),并且它不能调用其 它的任务。此外,函数必须带有至少一个输入,在函数中允许没有输出或输入输出说明。函 数可以调用其它的函数。 10.2.1 函数说明部分 函数说明部分可以在模块说明中的任何位置出现,函数的输入是由输入说明指定,形式 如下: f u n c t i o n [r a n g e] f u n c t i o n _ i d; i n p u t _ d e c l a r a t i o n o t h e r _ 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 e n d f u n c t i o n 第10章 其 他 论 题 93 下载
94wiD硬停述语言 Chia°b6eoM 下载 如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为1位二进制数。函数实 例如下: module Function Example parameter MAXBITS=8 on [MAXBITS-l: 0] Reverse Bits MAXBITS-1: 0] Din begin for(K=0; K< MAXBITS: K=K +1 Reverse Bits [MAXBITS-K]= Din [K] end endfunction 函数名为 Reverse Bits。函数返回一个长度为 MAXBITS的向量。函数有一个输入DinK 是局部整型变量 函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范 围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值 必须出现在函数定义中。下面是另一个函数的实例。 function Parity input [0: 31] Set reg Ret integer J: begin Ret= 0 J<=31;J=d+1) if (Set[J] Ret= Ret 1 Parity=Ret暑2 endfunction 在该函数中, Parity是函数的名称。因为没有指定长度,函数返回1位二进制数。Ret和J 是局部寄存器变量。注意最后一个过程性赋值语句赋值给寄存器,该寄存器从函数返回值 (与函数同名的寄存器在函数中被隐式地声明)。 1022函数调用 函数调用是表达式的一部分。形式如下: func id(exprI, expr2 以下是函数调用的例子: reg[ MAXBITS-1:0] New Reg,Regx;//寄存器说明 New Reg= Reverse Bits(Regx;//函数调用在右侧表达式内。 与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在
如果函数说明部分中没有指定函数取值范围,则其缺省的函数值为 1位二进制数。函数实 例如下: m o d u l e F u n c t i o n _ E x a m p l e p a r a m e t e r MAXBITS = 8; f u n c t i o n [M A X B I T S-1:0] R e v e r s e _ B i t s; i n p u t [M A X B I T S-1:0] D i n; i n t e g e r K; b e g i n f o r (K=0; K < M A X B I T S; K = K + 1) R e v e r s e _ B i t s [M A X B I T S-K] = D i n [K] ; e n d e n d f u n c t i o n . . . e n d m o d u l e 函数名为R e v e r s e _ B i t s。函数返回一个长度为 M A X B I T S的向量。函数有一个输入 D i n.K, 是局部整型变量。 函数定义在函数内部隐式地声明一个寄存器变量,该寄存器变量与函数同名并且取值范 围相同。函数通过在函数定义中显式地对该寄存器赋值来返回函数值。对这一寄存器的赋值 必须出现在函数定义中。下面是另一个函数的实例。 f u n c t i o n P a r i t y; i n p u t [0:31] S e t; r e g [0:3] R e t; integer J; b e g i n R e t = 0; f o r (J = 0;J <= 31; J = J + 1) if (S e t[J] = = 1 ) R e t = R e t + 1; P a r i t y = R e t % 2; e n d e n d f u n c t i o n 在该函数中, P a r i t y是函数的名称。因为没有指定长度,函数返回 1位二进制数。 R e t和J 是局部寄存器变量。注意最后一个过程性赋值语句赋值给寄存器,该寄存器从函数返回值 (与函数同名的寄存器在函数中被隐式地声明)。 10.2.2 函数调用 函数调用是表达式的一部分。形式如下: f u n c _ i d(e x p r 1 , e x p r 2 , . . . , e x p r N) 以下是函数调用的例子: r e g [M A X B I T S-1:0] N e w _ R e g , R e g _ X; //寄存器说明。 N e w _ R e g = R e v e r s e _ B i t s(R e g _ X); //函数调用在右侧表达式内。 与任务相似,函数定义中声明的所有局部寄存器都是静态的,即函数中的局部寄存器在 94 Verilog HDL 硬件描述语言 下载
Chinaopub.com 第0章其他论题95 下载 函数的多个调用之间保持它们的值 10.3系统任务和系统函数 Ⅴ erilog hdl提供了内置的系统任务和系统函数,即在语言中预定义的任务和函数。它们 分为以下几类 1)显示任务( display task) 2)文件输入输出任务( File i/ O task) 3)时间标度任务( timescale task) 4)模拟控制任务( simulation control task) 5)时序验证任务( timing check task) 6)PLA建模任务( PLA modeling task) ⑦)随机建模任务( stochastic modeling task) 8)实数变换函数( conversion functions for rea) 9)概率分布函数( probabilistic distribution function) PLA建模任务和随机建模任务不在本书的讨论范围内。 1031显示任务 显示系统任务用于信息显示和输出。这些系统任务进一步分为: 显示和写入任务 探测监控任务 ·连续监控任务 1.显示和写入任务 语法如下 task name (format specification, argument listI, format specification, argument list2 format specificationN, argument listN)i t name是如下编译指令的一种 Display sdisplayb sdisplayh display Write Swriteb Swriteh Swriteo 示任务将特定信息输出到标准输出设备,并且带有行结束字符:而写入任务输出特定 信息时不带有行结束符。下列代码序列能够用于格式定义: 告h或暑H 十六进制 或 十进制 八进制 号c或C ASCI穿符 告v或V:线网信号长度 或 层次名 间格式 如果没有特定的参数格式说明,缺省值如下
函数的多个调用之间保持它们的值。 10.3 系统任务和系统函数 Verilog HDL提供了内置的系统任务和系统函数,即在语言中预定义的任务和函数。它们 分为以下几类: 1) 显示任务(display task) 2) 文件输入/输出任务 (File I/O task) 3) 时间标度任务 (timescale task) 4) 模拟控制任务 (simulation control task) 5) 时序验证任务 (timing check task) 6) PLA建模任务 (PLA modeling task) 7) 随机建模任务 (stochastic modeling task) 8) 实数变换函数 (conversion functions for real) 9) 概率分布函数 (probabilistic distribution function) P L A建模任务和随机建模任务不在本书的讨论范围内。 10.3.1 显示任务 显示系统任务用于信息显示和输出。这些系统任务进一步分为: • 显示和写入任务 • 探测监控任务 • 连续监控任务 1. 显示和写入任务 语法如下: t a s k _ n a m e (f o r m a t _ s p e c i f i c a t i o n 1 , a r g u m e n t _ l i s t 1 , f o r m a t _ s p e c i f i c a t i o n 2 , a r g u m e n t _ l i s t 2 , . . . , f o r m a t _ s p e c i f i c a t i o n N , a r g u m e n t _ l i s t N) ; t a s k _ n a m e是如下编译指令的一种: $display $displayb $displayh $d i s p l a y o $write $writeb $writeh $w r i t e o 显示任务将特定信息输出到标准输出设备,并且带有行结束字符;而写入任务输出特定 信息时不带有行结束符。下列代码序列能够用于格式定义: %h 或 %H : 十六进制 %d 或 %D : 十进制 %o 或 %O : 八进制 %b 或 %B : 二进制 %c 或 %C : ASCII字符 %v 或 %V : 线网信号长度 %m 或 %M : 层次名 %s 或 %S : 字符串 %t 或 %T : 当前时间格式 如果没有特定的参数格式说明,缺省值如下: 第10章 其 他 论 题 95 下载
96wmD)硬件述语言 Chinapub.com 下载 Display与 Write:十进制数 sdisplayb与$ writeb:二进制数 display与$ write:八进制数 Sdisplayh与 Writer:十六进制数 可以用如下代码序列输出特殊字符: n换行 1t制表符 \字符\ ooo值为八进制值ooo的字符 告号字符告 例如: Display("simulation time is st"sme display(stime,": R=8b, Q=sb sb",R,s,Q, QB)i //因为没有指定格式,时间按十进制显示 Write("simulation time is: )i Write("st\n", stime) 述语句输出stme、R、S、Q和QB等值的执行结果如下: simulation time is 10:R=1,S=0,Q=0,QB=1 simulation time i 2.探测任务 探测任务有: Strobe Sstrobeb Sstrobeh strobed 这些系统任务在指定时间显示模拟数据,但这种任务的执行是在该特定时间步结束时才 显示模拟数据。“时间步结束”意味着对于指定时间步内的所有事件都已经处理了。 e(posedge Rst) Strobe("the flip-flop value is sb at time st",time 当Rst有一个上升沿时, Strobe任务输出Q的值和当前模拟时间。下面是Q和 Stime的一些 值的输出。这些值在每次Rst的上升沿时被输出。 The flip-flop value is 1 at time The flip-flop value is o at time The flip-flop value is 1 at time 其格式定义与显示和写入任务相同 探测任务与显示任务的不同之处在于:显示任务在遇到语句时执行,而探测任务的执行 要推迟到时间步结束时进行。下面的例子有助于进一步区分这两种不同任务 begin Display("After first assignment, cool has value b'b,) strobe("When strobe is executed, cool has value wb2 Cool Display("After second assignment, cool has value abaI
$ d i s p l a y与$ w r i t e :十进制数 $ d i s p l a y b与$ w r i t e b :二进制数 $ d i s p l a y o与$ w r i t e o :八进制数 $ d i s p l a y h与$ w r i t e h :十六进制数 可以用如下代码序列输出特殊字符: \n 换行 \t 制表符 \\ 字符\ \" 字符” \OOO 值为八进制值O O O的字符 %% 字符% 例如: $d i s p l a y("Simulation time is %t",$t i m e) ; $d i s p l a y( $t i m e,":R=%b,Q=%b,QB=%b", R,S,Q,QB); / /因为没有指定格式,时间按十进制显示。 $w r i t e("Simulation time is:); $w r i t e( " % t \ n " , $t i m e) ; 上述语句输出$ t i m e、R、S、Q和Q B等值的执行结果如下: Simulation time is 10 10:R=1, S=0, Q=0, QB=1 Simulation time is 10 2. 探测任务 探测任务有: $s t r o b e $s t r o b e b $s t r o b e h $s t r o b e o 这些系统任务在指定时间显示模拟数据,但这种任务的执行是在该特定时间步结束时才 显示模拟数据。“时间步结束”意味着对于指定时间步内的所有事件都已经处理了。 a l w a y s @ (p o s e d g e R s t ) $s t r o b e("the flip-flop value is %b at time %t",Q,$ t i m e) ; 当R s t有一个上升沿时, $s t ro b e任务输出Q的值和当前模拟时间。下面是 Q和$t i m e的一些 值的输出。这些值在每次R s t的上升沿时被输出。 The flip-flop value is 1 at time 17 The flip-flop value is 0 at time 24 The flip-flop value is 1 at time 26 其格式定义与显示和写入任务相同。 探测任务与显示任务的不同之处在于:显示任务在遇到语句时执行,而探测任务的执行 要推迟到时间步结束时进行。下面的例子有助于进一步区分这两种不同任务。 i n t e g e r C o o l; i n i t i a l b e g i n Cool = 1; $d i s p l a y("After first assignment,Cool has value %d", C o o l) ; $s t r o b e("When strobe is executed,Cool has value %d", C o o l) ; C o o l = 2; $d i s p l a y("After second assignment,Cool has value %d", C o o l) ; e n d 96 Verilog HDL 硬件描述语言 下载
第0章其他论题97 下载 产生的输出为 After first assignment, cool has value trobe is executed, cool h After second assignment, cool has valu 第一个$ display任务输出Cool的值1(Cool的第一个赋值)。第二个 Display任务输出 Cool的值2(Cool的第二个赋值)。 Strobe任务输出Cool的值2,这个值保持到时间步结 3.监控任务 监控任务有 Monitor Monitor Smoni torh Smonitoro 些任务连续监控指定的参数。只要参数表中的参数值发生变化,整个参数表就在时间 步结束时显示。例如 ⊥n⊥七ia monitor ("At t,d= sd, clk = sd") time, D, clk, ando is sb",9)i 当监控任务被执行时,对信号D、CIk和Ω的值进行监控。若这些值发生任何变化,则显 示整个参数表的值。下面是D、CIk和Q发生某些变化时的输出样本。 24, D= Clk=x and Q is O 25, D=x Clk= x and s is 1 30D=0 Clk=x and Q is 1 35 D=0 Clk= l and Q is 1 37, D=0 Clk =0 and S is 1 43,D=l Clk=o and Q is 1 监控任务的格式定义与显示任务相同。在任意时刻对于特定的变量只有一个监控任务 以被激活。 可以用如下两个系统任务打开和关闭监控 Smonitoroff;//禁止所有监控任务 monitory;//使能所有监控任务 这些提供了控制输出值变化的机制。$ monitor『任务关闭了所有的监控任务,因此不再 显示监控更多的信息。 Smonitoron任务用于使能所有的监控任务。 10.32文件输入输出任务 文件的打开和关闭 系统函数 Fopen用于打开一个文件 integer file pointer = fopen (file //系统函数 Fopen返回一个关于文件的整数(指针) 而下面的系统任务可用于关闭一个文件: fclose(file pointer): 这是一个关于它的用法的例子。 integer Iq File initial
产生的输出为: After first assignment,Cool has value 1 When strobe is executed,Cool has value 2 After second assignment,Cool has value 2 第一个 $d i s p l a y任务输出 C o o l的值1(C o o l的第一个赋值)。第二个 $d i s p l a y任务输出 C o o l的值 2(C o o l的第二个赋值)。$s t ro b e任务输出 C o o l的值 2,这个值保持到时间步结 束。 3. 监控任务 监控任务有: $m o n i t o r $m o n i t o r b $m o n i t o r h $m o n i t o r o 这些任务连续监控指定的参数。只要参数表中的参数值发生变化,整个参数表就在时间 步结束时显示。例如: i n i t i a l $m o n i t o r ("At %t,D = %d, Clk = %d"), $t i m e, D , C l k,"and Q is %b",Q); 当监控任务被执行时,对信号 D、C l k和Q的值进行监控。若这些值发生任何变化,则显 示整个参数表的值。下面是 D、C l k和Q发生某些变化时的输出样本。 监控任务的格式定义与显示任务相同。在任意时刻对于特定的变量只有一个监控任务可 以被激活。 可以用如下两个系统任务打开和关闭监控。 $m o n i t o r o f f; //禁止所有监控任务。 $m o n i t o r o n; //使能所有监控任务。 这些提供了控制输出值变化的机制。 $m o n i t o ro ff任务关闭了所有的监控任务,因此不再 显示监控更多的信息。$m o n i t o ro n任务用于使能所有的监控任务。 10.3.2 文件输入/输出任务 1. 文件的打开和关闭 系统函数$f o p e n用于打开一个文件。 i n t e g e r f i l e _ p o i n t e r = $ f o p e n(f i l e _ n a m e); / /系统函数$f o p e n返回一个关于文件的整数(指针)。 而下面的系统任务可用于关闭一个文件: $f c l o s e(f i l e _ p o i n t e r); 这是一个关于它的用法的例子。 i n t e g e r T q _ F i l e; i n i t i a l 第10章 其 他 论 题 97 下载
98mwi1mDl件述语言 Chia°b6eoM 下载 begin Tq File fopen("-/jb/div tq") 2.输出到文件 显示、写入、探测和监控系统任务都有一个用于向文件输出的相应副本,该副本可用于 将信息写入文件。这些系统任务如下 Sfdisplay $fdisplayb sfdisplayh sfdisplay Sfwrite Sfwriteb Sfwriteh sfwriteo Sfmonitor Simoni torb Sfmonitorh sfmonitoro 所有这些任务的第一个参数是文件指针,其余的所有参数是带有参数表的格式定义序列 下面的实例将作进一步解释说明。 integer Vec F⊥1e in⊥七ia1 begin vec File = sfopehdiv vec") display(vec File, " The simulation time st",stime)i /第一个参数 vec Fi1e是文件指针。 Fclose(vec file) end 等到$ display任务执行时,文件“div.vec”中出现下列语句 The simulation time is 3.从文件中读取数据 有两个系统任务能够用于从文件中读取数据,这些任务从文本文件中读取数据并将数据 加载到存储器。它们是 Sreadmemb 文本文件包含空白空间、注释和二进制(对于$ readmem b)或十六进制(对于 Sreadmemh)数字。每个数字由空白空间隔离。当执行系统任务时,每个读取的数字被指派 给存储器内的一个地址。开始地址对应于存储器最左边的索引。 reg [0: 3] Mem A [0: 63] in⊥七ia1 sreadmemb("ones and zero vec", Mem A) //读入的每个数字都被指派给从0开始到63的存储器单元。 显式的地址可以在系统任务调用中可选地指定,例如 Sreadmemb("rx vex", Mem A, 15,30 /从文件“xκ.vec”中读取的第一个数字被存储在地址15中,下一个存储在地址 //16,并以此类推直到地址30 也可以在文本文件中显式地给出地址。形式如下 @address in hexadecimal 在这种情况下,系统任务将数据读入指定地址。后续的数字从指定地址开始向后加载
b e g i n T q _ F i l e = $ f o p e n("~/ j b / d i v . t q ") ; . . . $f c l o s e(T q _ F i l e) ; e n d 2. 输出到文件 显示、写入、探测和监控系统任务都有一个用于向文件输出的相应副本,该副本可用于 将信息写入文件。这些系统任务如下: $f d i s p l a y $f d i s p l a y b $f d i s p l a y h $f d i s p l a y o $f w r i t e $f w r i t e b $f w r i t e h $f w r i t e o $f s t r o b e $f s t r o b e b $f s t r o b e h $f s t r o b e o $f m o n i t o r $f m o n i t o r b $f m o n i t o r h $f m o n i t o r o 所有这些任务的第一个参数是文件指针,其余的所有参数是带有参数表的格式定义序列。 下面的实例将作进一步解释说明。 i n t e g e r V e c _ F i l e; i n i t i a l b e g i n Vec_File = $fopen(" d i v . v e c ") ; . . . $f d i s p l a y(V e c _ F i l e,"The simulation time %t",$time); / /第一个参数V e c _ F i l e是文件指针。 $f c l o s e(V e c _ f i l e) ; e n d 等到$f d i s p l a y任务执行时,文件“d i v. v e c”中出现下列语句: The simulation time is 0 3. 从文件中读取数据 有两个系统任务能够用于从文件中读取数据,这些任务从文本文件中读取数据并将数据 加载到存储器。它们是: $readmemb $readmemh 文本文件包含空白空间、注释和二进制(对于 $ r e a d m e m b)或十六进制(对于 $re a d m e m h)数字。每个数字由空白空间隔离。当执行系统任务时,每个读取的数字被指派 给存储器内的一个地址。开始地址对应于存储器最左边的索引。 r e g [0:3] Mem_A [0:63]; i n i t i a l $r e a d m e m b( " o n e s _ a n d _ z e r o . v e c " , M e m _ A ) ; / /读入的每个数字都被指派给从0开始到6 3的存储器单元。 显式的地址可以在系统任务调用中可选地指定,例如: $r e a d m e m b( " r x . v e x " , M e m _ A , 1 5 , 3 0 ) ; / /从文件“r x . v e c”中读取的第一个数字被存储在地址1 5中,下一个存储在地址 / / 1 6,并以此类推直到地址3 0。 也可以在文本文件中显式地给出地址。形式如下: @ a d d r e s s _ i n _ h e x a d e c i m a l 在这种情况下,系统任务将数据读入指定地址。后续的数字从指定地址开始向后加载。 98 Verilog HDL 硬件描述语言 下载
Chinaopub.com 第0章其他论99 下载 10.33时间标度任务 系统任务 Sprinttimescale 给出指定模块的时间单位和时间精度。若$ printtimescale'任务没有指定参数,则用于输出 包含该任务调用的模块的时间单位和精度。如果指定到模块的层次路径名为参数,则系统任 务输出指定模块的时间单位和精度 Sprinttimescale Sprinttimescale(hier path to module)i 下面是这些系统被调用时输出的样本 Time scale of (c10) is 100ps/100ps Time scale of(C10. INST) is lt 系统任务 Stimeformat 指定%t格式定义如何报告时间信息,该任务形式如下 stimeformat(units number, precision suffix, numeric field width) 其中 units number为: 1:100ms 1 ms o us 0 us 8:10ns -10:100ps 100fs -14:10fs 系统任务调用 stimeformat(-4,3,ps",5)i Display("Current simulation time is t",stime) 将显示 Display任务中%t说明符的值,如下 current simulation time is 0.051 ps 如果没有指定 Stimeformat,%t按照源代码中所有时间标度的最小精度输出 10.34模拟控制任务 系统任务 s£ inish 使模拟器退出,并将控制返回到操作系统
10.3.3 时间标度任务 系统任务 $p r i n t t i m e s c a l e 给出指定模块的时间单位和时间精度。若 $p r i n t t i m e s c a l e任务没有指定参数,则用于输出 包含该任务调用的模块的时间单位和精度。如果指定到模块的层次路径名为参数,则系统任 务输出指定模块的时间单位和精度。 $p r i n t t i m e s c a l e ; $p r i n t t i m e s c a l e(h i e r _ p a t h _ t o _ m o d u l e) ; 下面是这些系统被调用时输出的样本。 Time scale of (C10) is 100ps/100ps Time scale of (C10.INST) is lus/100ps 系统任务 $t i m e f o r m a t 指定% t格式定义如何报告时间信息,该任务形式如下: $t i m e f o r m a t(u n i t s _ n u m b e r , p r e c i s i o n , s u f f i x , n u m e r i c _ f i e l d _ w i d t h) ; 其中u n i t s _ n u m b e r为: 0 : 1 s -1 : 100 ms -2 : 10 ms -3 : 1 ms -4 : 100 us -5 : 10 us -6 : 1 us -7 : 100 ns -8 : 10 ns -9 : 1 ns -10 : 100 ps -11 : 10 ps -12 : 1 ps -13 : 100 fs -14 : 10 fs -15 : 1 fs 系统任务调用 $t i m e f o r m a t(-4, 3, "ps", 5); $d i s p l a y("Current simulation time is %t",$time); 将显示$d i s p l a y任务中% t说明符的值,如下: Current simulation time is 0.051 ps 如果没有指定$t i m e f o r m a t,% t按照源代码中所有时间标度的最小精度输出。 10.3.4 模拟控制任务 系统任务 $f i n i s h; 使模拟器退出,并将控制返回到操作系统。 第10章 其 他 论 题 99 下载
100emD硬件述语言 Chinapub. coM 下载 系统任务 sst。p 使模拟被挂起。在这一阶段,交互命令可能被发送到模拟器。下面是该命令使用方法的例子, initial #500 $stop 500个时间单位后,模拟停止。 10.35定时校验任务 系统任务: setup(data event, reference event, limit) 如果 (t⊥ me of reference event- time of da ta event1⊥m⊥t 则报告时序冲突( timing violation) 系统调用实例如下: Setup(D, posedge ck, 1, 0) 系统任务: shold(reference event, data event, limit 如果 (time of data event -time of reference event limit 则报数据保持时间时序冲突 例如 sho⊥d(p。 sedge Ck,D,0.1); 系统任务 Ssetuphold是 Setup和$hold任务的结合 Ssetuphold(reference event, data event, setup limit, hold limit 而系统任务: 则检查信号的脉冲宽度限制,如果 threshold ⊥m⊥t
系统任务 $s t o p 使模拟被挂起。在这一阶段,交互命令可能被发送到模拟器。下面是该命令使用方法的例子。 i n i t i a l #500 $s t o p; 5 0 0个时间单位后,模拟停止。 10.3.5 定时校验任务 系统任务: $s e t u p(d a t a _ e v e n t , r e f e r e n c e _ e v e n t , l i m i t) ; 如果 (time_of_reference_event - time_of_data_event ) limit 100 Verilog HDL 硬件描述语言 下载