




免费预览已结束,剩余2页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2 如何编写Testbench1) 何时使用initial和alwaysinitial和always 是2个基本的过程结构语句,在仿真的一开始即开始相互并行执行。通常被动的检测响应使用always语句,而主动的产生激励使用initial语句。initial和always的区别是always 语句不断地重复执行,initial语句则只执行一次。但是,如果希望在initial里的多次运行一个语句块,怎么办?这时可以在initial里嵌入循环语句(while,repeat,for,forever 等),如:initialbeginforever /* 无条件连续执行*/begin endend其它循环语句请参考一些教材,这里不作赘述。另外,如果希望在仿真的某一时刻同时启动多个任务,可以使用fork.join语句。例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示:initialbegin 100 ; fork /*并行执行 */Send_task ;Receive_task ; joinEnd2) 如何作多种工作模式的遍历测试如果设计的工作模式很多,免不了做各种模式的遍历测试,而遍历测试是需要非常大的工作量的。我们经常遇到这样的情况:很多时候,各种模式之间仅仅是部分寄存器配置值的不同,而各模式间的测试都是雷同的。有什么方法可以减轻这种遍历测试的工作量?不妨试试for循环语句,采用循环变量来传递各种模式的配置值,会帮助减少很多测试代码,而且不会漏掉每一种模式.initialbegin for ( i = 0 ; i m ; i = i + 1 ) /*遍历模式1至模式m*/for ( j = 0 ; j n ; j = j +1 ) /*遍历子模式1至子模式n */begin case ( j ) /* 设置每种模式所需的配置值 */ 0 : 配置值 a ; 1 : 配置值 b ; 2 : 配置值 c ; endcase/*共同的测试向量*/endend3) 如何加速问题定位过程在这部分里,通过一些实际例子,介绍在出现问题时如何借助 testbench 加快问题的定位过程。1、监测内存分配内存分配和回收示意图在这个例子里,假设总共有2K的内存块,希望在测试程序里监测内存分配和回收的块号是否正确,监测是否存在同一块号重复分配、重复回收的情况。设置一个 2K位的变量对内存的使用情况进行记录,每一位对应一个内存块,空闲的块号记为1,被占用的块号记为0。该变量的初始值为全1,当分配一 个块号出去时先判断该位是否为空闲,若是空闲则将该位设置为被占用,否则就为重复分配错误。相反,当回收一个块号时,先判断该位是否被占用,若是被占用则将该位设置为空闲,否则就为重复回收错误。程序如下: always (posedge Clk or negedge Rst )begin if ( Rst = 1b0 )Mem_status = 2048 1b1 ; else beginif ( 层次路径 . rd ) /* 监测内存分配,block_rd 是分配的内存块号*/ if ( Mem_status block_rd = 1b1 )Mem_status block_rd = 1b0 ; else begin$display ( Error! 重复分配同一内存块! ) ;$stop ; endif ( 层次路径 . wr ) /* 监测内存回收,block_wr 是回收的内存块号*/ if ( Mem_status block_wr = 1b0 )Mem_status block_wr ”符号进行触发,如下例:event e1 ; /*定义一个事件*/always ( e1 ) /*事件e1 作为敏感变量*/begin .endinitialbegin e1 ; /*创建事件e1来触发上面的always语句*/ .end事件(event )与任务(task)的区别是:执行事件触发后可以立即继续往下执行语句,只起一个触发作用,至于被触发的事件何时执行完毕并不影响程序继续执行。而调用一个任务后,必须等待任务完成才能返回控制权。3) 模块参数当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式:1)defparam 重定义参数语法:defparam path_name = value ;低层模块的参数可以通过层次路径名重新定义,如下例:module top ( .)input.;output.;defparam U1 . Para1 = 10 ; /*修改实例 U1 模块中的para1 */M1 U1 (.);endmodulemodule M1(.);parameter para1 = 5 ;input.;output.;.endmodule在上例中,模块M1参数 para1 的缺省值为5,而模块top实例了M1后将参数的值改为10。2) 实例化时传递参数在这种方法中,实例化时把参数传递进去,如下例所示:module top ( .)input.;output.;M1 ( 10 ) U1 (.);endmodule在该例中,用#( 10 )修改了上例中的参数para1,当有多个参数时,用逗号隔开,如( 10 , 5 ,3 )传递了3个参数值。模块参数的方法使得模块的重用性更强,当需要在同一个设计中多次实例化同样的模块,只是参数值不同时,就可以采用模块参数的方式,而不必只因为参数不同产生了多个文件。4) 其他要注意的几个点4) 注意与wait的区别都是使用沿触发。wait语句都是使用电平触发。5) 注意$sreadmemb(h)与$readmemb(h)的区别$sreadmemb(Memory, StartAddr, FinishAddr, String , ) :读字符串到Memory。$readmemb(File, Memory ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老旧小区改造施工团队管理方案
- 水库自动化运维系统方案
- 照明工程施工组织与工序衔接方案
- 钢结构冷弯薄壁型材质量通病及预防措施
- 学生实验室助理岗位职责
- 储能电池梯次利用技术应用方案
- 五年级下册科学重点难点突破计划
- 医院药品采购计划周期性评估措施
- 44小学春季假期作业讲评与教学衔接计划
- 成品码放保护措施
- 2025年中国商用开水器市场调查研究报告
- 中国绿色食品市场深度调查研究报告2025-2028版
- 2025年苏教版小学数学小升初模拟考试测试卷及答案(共五套)
- 基于赋能理论的老年COPD稳定期患者慢病管理方案的构建及应用
- 公司员工特殊岗位补贴政策
- 2025会计基础工作规范
- 《人工智能基础与应用-(AIGC实战 慕课版)》全套教学课件
- 2025教育方针解读
- 消化道出血护理查房课件(完整版)
- 教师职业道德与专业发展知到智慧树章节测试课后答案2024年秋鲁东大学
- 物业总经理转正述职报告
评论
0/150
提交评论