版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Systemveri 10g数据类型1合并数组和非合并数组1)合并数组:存储方式是连续的,中间没有闲置空间。例如,32bit的寄存器,可以看成是 4个8bit的数据,或者也可以看成是1个32bit的数据。表示方法:数组大小和位,必须在变量名前指定,数组大小必须是【 msb: 1sb】Bit3:07:0 bytes ;2)二维数组和合并数组识别:合并数组:bit 3:0 7:0 arrys;大小在变量名前面放得,且降序二维数组:int arrays0:70:3;大小在变量名后面放得,可降序可升序位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素 个数。3)非合并数组一般仿
2、真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。非合并数组:字的地位存放变量,高位不用。表示方法:Bit7:0 bytes;4)合并数组和非合并数组的选择(1)当需要以字节或字为单位对存储单元操作。(2)当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器 数据的变化来唤醒,需要用到, 只能用于标量或者合并数组。Bit3:0 7:0 barray3;表示合并数组,合并数组中有 3个元素,每个元素时8bit, 4个元素可以组成合并数组可以使用barry0作敏感信号。l动态数组随机事物不确定大小。使用方法:数组在开始是空的,同时使用ne
3、w口来分配空间,在newn指定元素的个数。Int dyn口;Dyn = new5;Ref int array);If(len<0)begin$display( " Bad len ");Returun;rant,.request,.rst, .clk);Test tl(arbif);EndmoduleIModport背景:端口的连接方式包含了方向信息,编译器依次来检查连续错误;接口使用无信号的连 接方式。Modport将接口中信号分组并指定方向。例子:l在总线设计中使用modport并非接口中每个信号都必须连接。Data总线接口中就解决不了,个人觉得因为data是一个
4、双驱动l时钟块作用:一旦定义了时钟块,而不需要描述确切的时钟信号和边沿,即使改变了时钟块中的 时钟或边沿,也不需要修改测试代码应用:将测试平台中的信号,都放在clocking中,并指定方向(以测试平台为参考的方向)并且在 modprot test (clocking cb ,最完整的接口:Interface arb_if(input bit clk);Logic1:0 grant,request;Logic rst;Clocking cb (posedge clk);Output request;Input grant;EndclockingModport test (clocking cb,
5、 Output rst);Modport dut (input clk, request,rst,Output grant);endinterface变化:将request和grant移动到时钟块中去了,test中没有使用了。l接口中的双向信号Interface master_if(input bit clk);=();Id =count+;约束l约束块中,只能包含表达式,不能赋值。1) dist权重分布dist带有一个值的列表及相应的权重,中间用 :=或:/分开。值或权重可以是常量或变 量。权重的和不必是100.:=表示范围内,每一个值的权重是相同的;:/表示范围内,权重要均匀分布2) In
6、side产生一个值的集合,在值的集合中取随机值时,机会相等。3)在集合中使用数组l条件约束Systemverilog支持两种关系操作。和ifelse可产生和case效果类似的语句块,可以用于枚举类型的表达式。l双向约束l控制多个约束块作用:可以打开或关闭某个约束可以使用内建的打开或关闭。l内嵌约束背景:很多测试只会在代码的一个地方随机化对象,但是约束越来越复杂时,Systemverilog可以使用randomized with来增加额外的约束,这和在类里增加的约束是 等效的。lPre_randomize 和 post_randomize 函数有时候需要再调用randomize ()之前或之后立
7、即执行一些操作。随机化前:设置类里的一些非随机变量(如上下限、权重),随机化后:计算数据的误差矫正值。l约束的技巧1)约束中使用变量2)使用非随机值如果一套约束在已产生了几乎所有想要的激励向量,但还缺少几种。可以使用rand_mode把这些变量设置为非随机变量。l数组约束Systemverilog可以用foreach对数组中的每一个元素进行约束。线程及线程间的通信l测试平台使用许多并发执行的线程。测试平台隶属于程序块。Systemverilog引入两种新的创建线程的方法一forkjoin_non琲口 forkjoin_any1) 使用forkjoin_non冰产生线程在调度其内部语句时,父线程
8、继续执行。2) 使用forkjoin_an取现线程同步在调度块内语句,当第一个语句执行完,父线程才继续执行。l动态线程Systemverilog中可以动态创建线程。用法:forkjoin_none放在了任务中,而不是包含两个线程。原因:主程序中有连个线程:发送和检测线程。但是不能同时启动,发送事物后,才能检测,否则还未产生数据,就开始检测;但是检测又不能阻塞下一次发送事物的线程。所以 forkjoin_none放在了检测task任务(后作用的线程中)中,例:测试平台产生随机事物并发送到DUT中,DUT把事物返回到测试平台。测试平台必须等到事物完成,但同时不希望停止随机事物的发送。Program
9、 automatic test ();Taskcheck_trans(Transaction tr);ForkBeginEndJoin_noeEndtaskInitial beginRepreat(10)beginTr= new();Assert。);join_any 后力口 disable。3)停止多个线程Disable fork能停止从当前线程中衍生出来得所有子线程。应该使用fork .join把目标代码包含起来,以限制 Disable fork的作用范围。l事件背景:Verilog中当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争就出现了。如果触发线程先于阻塞线
10、程,则触发无效(触发是一个零宽度的脉冲)。解决方法:Systemverilog引入了 triggered ()函数,用于检测某个事件是否已被触发过,包括正 在触发。线程可以等待这个结果,而不用在操作符上阻塞。例子:Event el, e2;Initial begin->e1;e2;EndInitial begin->e2;e1;End上面的代码,假设先执行第一个块,再执行第二个块。第一个块会阻塞在e2 (阻塞先执行),直到e2触发,再运行(触发后执行);在执行第二个块时,会阻塞在e1,但是e1已经触发(触发先执行,阻塞后执行,触发是个零宽度的脉冲,会错过第一个事件而 锁住)解决方法
11、:用 wait ()来代替阻塞 el,如果先触发,也可以执行。l等待多个事件最好的力法是:采用线程计数器来等待多个线程。l旗语Get 0可以获取一个或多个钥匙,put 0可以返回一个或多个钥匙。Try_get()获取一个旗语而不被阻塞。l信箱背景:如何在两个线程中传递信息考虑发生器需要创建很多事物并传递给驱动器的情 况。问题:如果使用发生器的线程去调用驱动器的任务。这样,发生器需要知道驱动器的 层次化路径(类的层次化),降低了代码的可重用性; 还迫使发生器和驱动器同一速率运行, 当一个发生器需控制多个驱动器时会发生同步问题。解决办法:把驱动器和发生器当成各个处理事物的对象,之间通过信道交换数据
12、。信 道允许驱动器和发生器异步操作;引入问题:你可能倾向于仅仅使用一个共享的数据或队列,但这样,编写实现线程间的读写和阻塞代码会很困难。解决办法:可以使用systemverilog中的信箱。把信箱看出一个具有源端和收端的FIFO.操作:1)信箱的容量可以指定,new (size) , size限制信箱中的条目,size为0,或没指定, 则信箱是无限大。3) Put 0放数据,get 0可以移出数据。Peek ()可以获取信箱中数据的copy而不移出。3)信箱中可以放句柄,而不是对象。漏洞:在循环外只创建一个对象,然后使用循环对对象随机化,信箱中是句柄,最终 得到的是一个含有多个句柄的信箱,多个
13、句柄都指向同一个对象。解决办法:在循环中,创建多个对象。l异步线程间使用信箱背景:很多情况下,由信箱连接的两个线程应该步调一致,这样生产方才不至于跑到消费方前。好处:最好层的generator需要等待低层的数据发完后才能结束。测试平台能精确知道 所有激励发出去的时间。两种情况两个线程同步,需要额外的握手信号。否则,出现生产方运行到结束,消费方还启动。1)信箱容量为1,两个线程同步因阻塞,连个线程不需要握手信箱3)容量不为1,线程间同步需要使用握手信号,以使 producer不超前于 consumer;如果 consumer超前于 prodecer 会阻塞。解决办法1)使用定容信箱和 peek实
14、现线程同步:(比较好)消费方:consumer使用信箱方法peek ()获取信箱里的数据的copy而不将其移出,当consumer处理完数据后,便使用 get ()移出数据。特点:信箱容量定义为1,不需要握手信号。CalssconsumerRepeat (n) begin(i);$display( " consumer:after get( )” ,i);(i);Endendcalss如果直接使用get ()替代peek (),那么事务会被立刻移出,这样可能会在consumer完成事务前,producer生成新的数据。 -2)使用信箱和事件实现线程同步使用边沿敏感的阻塞语句 hand
15、shake代替电平触发 wait()。因为:线程中任务run ()使用循环,事件阻塞只能使用handshake。局限:如果遇到producer线程的阻塞和 consumer线程的触发同时发生,则可能出现次 序上的问题。3)使用两个信箱实现线程同步使用另一个信箱把 consumer的完成信息发回给 producer。目的:在producer线程中,处理完事物后,用一个 get ()来阻塞。特点:信箱容量大于1.Maiboxmbx , rtn;Class prodecerFor(int i=0; i<4;i+) begin(i);(i); EndEndclassClass consumerR
16、epeat(3) begin(i);(-i); EndEndclass说明:信箱的卞造函数中Mbx =new();Rtn =new(),信箱容量为无穷大。如何实现同步虽然信箱容量为无穷大,producer线程发完一个数据后遇到get ()会阻塞,不能放入第二个数据;等到consumer得到第一个数据并且处理完后,通过另一个信箱返回一个数据,producer才继续放第二个数据。因为get 0得到数据后,将信箱中数据取出。表象:信箱容量定义为无穷大,但是实 际上也是producer放一个数据,consumer取一个数据;然后 producer再放第二个数据,依 次类推。这样确保producer不会
17、超前于consumer线程,而将数据都写入信箱。4)其他的同步技术通过变量或旗语阻塞也可以实现握手。事件是最简单的结构,其次是通过变量阻塞。旗语相当于第2个信箱,但是没有交换信息。Systemverilog中的信箱比其他技术要差,原因是无法在producer放入第一个事务时,让它阻塞。 Producer一直比consumer提前一个事务 的时间。lWait()和卜2门$八2卜3使用范围4) Wait(),用于等待一个事件;2)循环中等待事件,只能用 handshake3)两个线程的同步,一般任务run ()使用循环,所以只能使用 handshake。注意事项:1)在循环中,等待事件不能用Wai
18、t(),因为如果事件触发一次,wait 0语句一直为真,进入不断的循环。下一次循环中,不会阻塞。5) handshake如果触发事件,先于等待事件。会等不到事件,因为(事件触发,是 一个零宽度的脉冲)OPP的高级编程技巧l继承背景:为总线事务增加一个错误功能并带可变延时的复杂类。方法如下:1。使用合成,即在类中例化另一个类型的类。有时候很难将功能分成独立的部分。如 果使用合成,则需要为正确和错误事务分别创建不同的类,正确类的测试平台需要重写以处理错误类的对象。2)使用扩展类作用:当需要增加事务,而对现有的测试代码修改越少越好,。例如增加错误注入功能。扩展类和类合成区别:扩展类解决,增加新事务,
19、使用类合成中,大量修改代码的麻烦。如何使用:扩展类共享基类的变量和子程序。1)基本类中的方法,需标记为virtual ,这样扩展类中才可以重新定义。 扩展类中函数, 和基类中函数名一样时,通过 supper.函数名,调用基类中函数。 Systemverilog中不允许方 式经行多层调用。2)如果基类构造函数 new ()有参数,那么扩展类,必须有一个构造函数,并在构造函 数的第一行调用基类的构造函数。Class baselFunction new (inputint var );=var;endfunctionendclassclassextendedextends baselfunction
20、 new(input int var);(var);endfunctionendclass3)OPP规则指出:基类的句柄,也可以指向扩展类的对象。(好好体会)l蓝图模式1)背景:一个简单的发生器,通过信箱将数据传递给驱动器。class generatormailboxgen2drv;transaction tr;function new(input mailbox gen2drv)=gen2drv;endfunctiontask run;forever begintr = new();assert;(tr);$cast做任务使用时,systemverilog会在运行时,检查源对象类型和目的对象
21、类型不 匹配,会报错;$cast做函数使用时,运行时,仍做类型检查,在不匹配时,不会报错,$函数返回0.前面所述:基类句柄可以指向任何它的扩展类的对象、1)基类句柄指向扩展类对象 一一出现情况:修改蓝图,不改过多代码,增加功能Transaction tr; 基类句柄BadTrbad ; 扩展类句柄Bad = new ();Tr= bad ; 基类句柄指向扩展类对象,掉用的是扩展类的方法2)扩展类句柄指向基类对象出现情况:基类virtual方法copy函数,它的继承类中copy函数将基类句柄赋值给扩展类句柄,使扩展类句柄指向基类对象,一般编译器会出错,不能运行,所以非常小心;只有基类句柄指向扩展
22、类对象时,再将扩展类句柄指向基类对象时,不出错。为了检测基类句柄是否指向了扩展对象,并且不让编译器报错,可以使用$cast()函数检测。当把扩展类句柄指向基类对象时,发生什么Tr= new ();Bad = tr; 扩展类句柄指向基类句柄上述会发生错误,编译不会被通过。因为有些属性在基类中不存在;但是扩展类句柄 指向基类句柄不总是非法的(见下面代码,是可以的),当基类句柄指向一个扩展类对象时是允许的。Transcation tr;BadTr bad,bad2;Bad= new ();Tr = bad;/基类句柄指向扩展类对象$cast(bad2,tr);/扩展类句柄指向基类对象if(!$cas
23、t(bad2,tr);$display( "cannot assign tr to bad2 ");$display;l句柄类型和对象类型差异(书中翻译的不准,type of handdle和object)个人理解:Transaction tr;句柄 tr 类型是 transaction句柄类型:关键字对象类型:类中成员的类型差异l虚方法和多态多态:多个程序使用一个共同的名字的现象。多态解决问题:计算机建构面临的一个问题。让物理内存很小的情况下,让处理器能 够对很大的地址空间寻址。针对这个问题引入了虚拟内存。虚拟方法继承劣势:基类使用了虚拟方法,扩展类也必须使用相同的签名”
24、,扩展类中虚拟子程序不能增加或删除参数,这意味着必须提前做好规划。l对象复制1)因为是 virtual函数,扩展类中 copy方法也必须是transaction型的,但是要copy的是badtr类型的,所以要 new一个bad带有copy的事物基类。Class transaction ;Rand bit31:0 src,dst,data8;Bit31:0 crc;Virtual function transaction copy ();Copy= new();=s rc;=dst;=data;=crc;EndfunctionEndclass带有copy的扩展类Calss badtr exten
25、ds transactionRand bit bad_crc;Virtual function badtr copy();/ 错误Virtual function transaction copy();Badtrbad;Bad = new();=src;=dst;=data;=crc;=bad_crc;Returnbad;Rendfunctionendclass2)优化途径一,创建一个独立的函数copy_data,这样每个类只负责copy其局部变量,即扩展类中的copy函数用(tr),代替了基类中变量的复制。代码的重用性提高。$cast(bad,tr);/扩展类句柄指向基类句柄使用的情况: 因
26、为virtual函数,在继承中,虚拟函数必须和基类中名称和参数也一 致。这样扩展类中copy_data函数参数仍然是transaction类型的tr,这样出现了参数是基类句柄,但是copy_data函数内要作的确实扩展类的成员,就要将基类句柄参数赋值给扩展类 句柄,要将扩展类badtr类型的数据返回,所以必须用 $cast(bad,tr)。2)优化途径二,最好的。前面的 copy子程序都会创建一个新对象,改进的一种方法就 是指定复制对象的存放地址。Virtual functiontransaction copy (transaction to =null );if(to = null)copy = new();elsecopy = to;copy_data(copy);endfunctionl抽象类和纯虚方法背景:验证的目标之一是创建多个项目共享的代码。目的:systemverilog有两种方法创建共享的基类:抽象类和纯虚方法Virtual class (抽象类):可以被扩展但是不能被直接例化。Purevirtual function (纯虚方法):没有实体的方法原
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文书模板-应急救护长校培训协议书
- 音乐教学新方法:《童心是小鸟》课件
- 2024年教育改革:《炉中煤》课件的优化路径
- 2024年故宫课件:古代皇家生活与习俗的再现
- 2024年春季特辑:幼儿园数学教学
- 必修二专题三第20课时伟大的历史性转折及走向社会主义现代化建设新阶段
- 2024年幼儿园大班《家》语言教案探析
- 2021年国贸专业毕业论文题目-.10审核结果
- 地中海风格全解析
- 2024年VB程序设计课程教案:理论与实践相结合
- DB4401-T 10.5-2019 +反恐怖防范管理++第5部分:教育机构-(高清现行)
- 广东深圳市福田区选用机关事业单位辅助人员和社区专职工作者365人模拟试卷【共500题附答案解析】
- (本科)新编大学英语写作revised chapter 2ppt课件(全)
- 表格02保洁质量评分表
- 上海中、低压电网配置原则及典型设计
- 公共经济学ppt课件(完整版)
- 非参数统计教学ppt课件(完整版)
- 关于成立医院爱国卫生委员会及完善工作职责制度的通知
- 公司股权转让协议_1
- 常用高颈法兰尺寸表
- 基于嵌入式的温度传感器的设计
评论
0/150
提交评论