版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、提纲过程时序控制函数与任务系统任务(函数)编译预处理时序控制所谓时序控制就是用某种方式控制某一段程序何时执行。前面的多个例子中都包含有时序控制的内容。always后面跟的过程块是否执行,决定于它的触发条件是否满足。这个触发条件就是时序控制。除了在always块的开头进行时序控制之外,在块内也可以进行时序控制。基于时延的时序控制(#delay):延迟指定时间步后执行边沿敏感的时序控制:()在信号发生翻转后执行。可以说明信号有效沿是上升沿(posedge)还是下降沿(negedge)。可以用关键字or指定多个参数,也可以以逗号分割。电平敏感的时序控制:wait()直至expr值为真时(非零)才执行
2、。若expr已经为真则立即执行。时序控制的三种形式在test bench中使用简单延时(#延时)施加激励,或在行为模型中模拟实际延时。在简单延时中可以使用参数。module muxtwo (out, a, b, sl); input a, b, sl; output out; reg out; always ( sl or a or b) if (! sl) #10 out = a; / 从a到out延时10个时间单位 else #12 out = b; /从b到out延时12个时间单位endmodule简单延时时序控制可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以用关键字 posed
3、ge 和 negedge 限定信号敏感边沿。敏感表中可以有多个信号,用关键字or连接。module reg_ adder (out, a, b, clk); input clk; input 2: 0 a, b; output 3: 0 out; reg 3: 0 out; reg 3: 0 sum; always ( a or b) / 若a或b发生任何变化,执行 #5 sum = a + b; always ( negedge clk) / 在clk下降沿执行 out = sum;endmodule边沿敏感时序事件:eventevent也是一种边沿敏感时序。event是Verilog的一种
4、数据类型。event 由”-”符来触发例:event Ready, Doneinitial- Done;always(Done) begin. . .- Ready ;endalways(Ready)begin. . .- Done;end事件不可综合wait用于行为级代码中电平敏感的时序控制。module latch_adder (out, a, b, enable); input enable; input 2: 0 a, b; output 3: 0 out; reg 3: 0 out; always ( a or b) begin wait (!enable) / 当enable为低电
5、平时执行 out = a + b; endendmodulewait语句:电平敏感时序控制wait语句不可综合module wait_test;reg clk, waito, edgeo;initial begin clk = 0;edgeo=0;waito=0;endalways #50 clk = clk;always (clk) #5 edgeo = edgeo;always wait(clk) #5 waito = waito;endmodule过程时序控制(例子)提纲过程时序控制函数与任务系统任务(函数)编译预处理Verilog的任务及函数Verlilog中可以通过任务和函数实现大模
6、块的结构化。任务(task)通常用于仿真,或对硬件进行行为描述可以包含时序控制(#延迟,, wait)可以有 input,output,和inout参数可以调用其他任务或函数函数(function)通常用于计算,或描述组合逻辑不能包含任何延迟;函数仿真时间为0只含有input参数并由函数名返回一个结果可以调用其他函数,但不能调用任务Verilog的任务及函数任务和函数必须在module内调用在任务和函数中不能声明wire所有输入/输出都是局部寄存器任务/函数执行完成后才返回结果。若任务/函数中有forever语句,则永远不会返回结果任务 下面的任务中含有时序控制和一个输入,并引用了一个modu
7、le变量,但没有输出、输入输出和内部变量,也不显示任何结果。module top; reg clk, a, b; DUT u1 (out, a, b, clk); always #5 clk = !clk; task neg_clocks; input 31:0 number_of_edges; repeat( number_of_edges) ( negedge clk); endtask initial begin clk = 0; a = 1; b = 1; neg_clocks(3); / 任务调用 a = 0; neg_clocks (5); b = 0; endendmodule时
8、序控制中使用的信号(例如clk)一定不能作为任务的输入,因为输入值只向该任务传送一次。任务引用了一个module变量。module mult (clk, a, b, out, en_mult); input clk, en_mult; input 3: 0 a, b; output 7: 0 out; reg 7: 0 out; always ( posedge clk) multme (a, b, out); / 任务调用 task multme; / 任务定义 input 3: 0 xme, tome; output 7: 0 result; wait (en_mult) result =
9、 xme * tome; endtaskendmodule任务任务可以有input, output 和 inout参数。传送到任务的参数和与任务I/O说明顺序相同。可引用主调模块中的变量。可以在任务内使用时序控制。主要特点: 从代码中多处调用任务时要小心。因为任务的局部变量的只有一个拷贝,并行调用任务可能导致错误的结果。在任务中使用时序控制时这种情况时常发生。 在任务或函数中引用主调模块的变量时要小心。函数(function)函数中不能有时序控制,但调用它的过程可以有时序控制。函数名f_or_and在函数中作为register使用module orand (a, b, c, d, e, out
10、); input 7: 0 a, b, c, d, e; output 7: 0 out; reg 7: 0 out; always ( a or b or c or d or e) out = f_or_and (a, b, c, d, e); / 函数调用 function 7:0 f_or_and; input 7:0 a, b, c, d, e; if (e = = 1) f_or_and = (a | b) & (c | d); else f_or_and = 0; endfunctionendmodule函数主要特性:函数定义中不能包含任何时序控制语句。函数至少有一个输入,不能包含
11、任何输出或双向端口。函数只返回一个数据,其缺省为reg类型。传送到函数的参数顺序和函数输入参数的说明顺序相同。函数在模块(module)内部定义。函数只返回单个值,可以采用信号拼接的方式给多个信号赋值。 o1, o2, o3, o4 = f_ or_ and (a, b, c, d, e);函数 要返回一个向量值(多于一位),在函数定义时在函数名前说明范围。函数中需要多条语句时用begin和end。 不管在函数内对函数名进行多少次赋值,值只返回一次。module foo; input 7: 0 loo; output 7: 0 goo;/ 可以在连续赋值中调用函数 assign goo = z
12、ero_count ( loo ); function 3: 0 zero_count; input 7: 0 in_ bus; integer I; begin zero_count = 0; for (I = 0; I 8; I = I + 1) if (! in_bus I ) zero_count = zero_count + 1; end endfunctionendmodule函数函数返回值可以声明为其它register类型:integer, real, 或time。在任何表达式中都可调用函数module checksub (neg, a, b); output neg; reg
13、neg; input a, b; function integer subtr; input 7: 0 in_a, in_b; subtr = in_a - in_b; / 结果可能为负 endfunction always (a or b) if (subtr( a, b) 0) neg = 1; else neg = 0;endmodule函数函数中可以对返回值的个别位进行赋值。函数值的位数、函数端口甚至函数功能都可以参数化。. . .parameter MAX_BITS = 8;reg MAX_BITS: 1 D;function MAX_BITS: 1 reverse_bits; in
14、put MAX_BITS-1: 0 data; integer K; for (K = 0; K MAX_BITS; K = K + 1) reverse_ bits MAX_BITS - (K+ 1) = data K;endfunctionalways (posedge clk) D = reverse_bits (D) ;. . .关于使用任务和函数的小结任务和函数都是用来对设计中多处使用的公共代码进行定义;使用任务和函数可以将模块分割成多个可独立管理的子单元,增强模块的可读性和可维护性。任务可以具有任意多个输入、输入输出和输出变量;在任务中可以使用延迟、事件和时序控制结构;在任务中可以
15、调用其他任务与函数;关于使用任务和函数的小结函数只能有一个返回值,并且至少要有一个输入变量;函数中不能使用延迟、时间和时序控制结构,可以调用其他函数,但是不能调用任务。当声明函数时,Verilog仿真器都会隐含地声明一个同名的寄存器变量,函数的返回值通过这个寄存器传递回调用处。提纲过程时序控制函数与任务系统任务(函数)编译预处理系统任务Verilog中提供了大量的系统任务,用于显示、文件操作、产生随机数等。系统任务以$开头。系统任务不能综合,只能用于仿真。下面介绍几种常用的系统任务。显示任务进一步划分显示和写入任务探测监控任务连续监控任务显示和写入任务语法形式taskname (formats
16、pecification1, argumentlist1, formatspecification2, argumentlist2 ,., formatspecification N, argumentlist N) ;Taskname:$display/$displayb/$displayh/$displayo$write/$writeb/$writeh/$writeo显示任务将特定信息输出到标准输出设备,并且带有行结束字符;而写入任务输出特定信息时不带有行结束符。格式说明由字符串、 %引导的格式控制符和转义字符构成。例子:(“The value of Var1 is %d in decim
17、aln”, Var1)格式控制符%h 或%H : 十六进制%d 或%D : 十进制%o 或%O : 八进制%b 或%B : 二进制%c 或%C : ASCII字符%v 或%V : 线网信号长度%m 或%M : 模块层次名%s 或%S : 字符串%t 或%T : 当前时间转义字符n 换行t 制表符 字符 字符”OOO 值为八进制值O O O的字符% 字符%探测任务strobe$strobe$strobeb $strobeh$strobeo探测任务与显示任务的区别$display任务与许多其他语句在同一时间单位执行时,这些语句和$display的执行顺序不确定。$strobe任务总是在其他语句执行
18、完毕后再显示数据。提供了一种同步机制。同一组中的b/h/o表示默认输出方式是二进制/十六进制/八进制。监控任务监控任务有:$monitor /$monitorb/$monitorh/$monitoro特点:连续监控指定的参数。只要参数表中的参数值发生变化,整个参数表就在时间步结束时显示。在任意时刻对于特定的变量只有一个监控任务可以被激活。监控任务的控制可以用如下两个系统任务打开和关闭监控$monitoroff; /禁止所有监控任务。$monitoron; /使能所有监控任务。文件输入/输出任务文件的打开integer file_handle = $fopen(“文件名”);返回的是一个文件指针
19、多通道描述符,只有1比特为1文件的关闭$fclose(文件指针);文件输入/输出任务文件的输出$fdisplay/$fdisplayb/$fdisplayh/$fdisplayo$fwrite/$fwriteb/ $fwriteh/ $fwriteo/$fstrobe/ $fstrobeb/ $fstrobeh/ $fstrobeo/$fmonitor/$fmonitorb/$fmonitorh/$fmonitoro所有这些任务的第一个参数是已打开的文件句柄,其他与显示/探测/监测函数相同。文件输入/输出任务从文本文件中读取数据$readmemh(file_nam, memory_name,
20、,start_addr, end_addr);$readmemb(file_nam, memory_name, ,start_addr, end_addr);文本文件包含空白空间、注释和二进制(对于$readmemb)或十六进制(对于$readmemh)数字。每个数字由空白空间隔离。当执行系统任务时,每个读取的数字被指派给存储器内的一个地址。开始地址对应于存储器最左边的索引。不需要文件打开仿真控制系统任务$finish;使仿真器退出,并将控制返回到操作系统。$stop;使仿真被挂起。在这一阶段,交互命令可以被发送到仿真器。initial #500 $stop;500个时间单位后,仿真暂停。时序
21、校验任务$setup(data_event , reference_event , limit) ;检查建立时间是否满足要求(time_of_reference_event - time_of_data_event)limit报告时序冲突(timing violation);时序仿真内部自动产生。$hold(data_event , reference_event , limit) ;(time_of_data_event-time_of_reference_event)limit仿真时间函数 $time:返回6 4位的整型仿真时间给调用它的模块。 $stime:返回3 2位的时间。 $realtime:向调用它的模块返回实型仿真时间。随机数产生函数$random(seed)根据种子变量(s e e d)的取值按3 2位的有符号整数形式返回一个随机数。种子变量(必须是寄存器、整数或时间寄存器类型)控制函数的返回值,即不同的种子将产生不同的随机数。如果没有指定种子,每次$random函数被调用时根据缺省种子产生随机数。其他分布的随机数产生$distuniform(seed,start,end)$distnormal(seed,mean,standarddeviation,upper)$distexp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【每日一练】《晨读晚练》英语高三年级上学期第三周参考答案及解析3
- 深圳市宏电技术股份有限公司首次公开发行股票并在创业板上
- 部编版八年级语文下册全册教案
- 土壤沉积物中全氟辛酸(PFOA)、全氟辛烷磺酸(PFOS)
- 天津市六区行政区划图
- 高科技虚拟现实游戏内容开发与设备运营考核试卷
- 铜矿选矿厂能源消耗与节能措施考核试卷
- 谷物磨制行业政策法规与标准研究考核试卷
- 贵金属压延加工在柔性电子器件的应用考核试卷
- 铁路工程合同管理与变更控制考核试卷
- 八大危险作业检查表
- 工程项目管理(三控三管一协调)
- 初三家长会语文教师发言
- 游戏机策划方案
- 2024消防安全基础知识培训课件
- 《小儿留置导尿管》课件
- 粤教版科学四年级上册全册试卷(含答案)
- 宫腔镜诊治规范
- 安全管理计划指标和指标体系
- 仓库物料盘点作业规范培训课件
- 六年级《牵手两代-第二讲-乖孩子为什么会厌学》家长课程培训
评论
0/150
提交评论