zer0hz
IC验证工程师
展开
-
router(五)-Synopsys验证实验
一、interface的建立在这里插入代码片原创 2021-12-14 23:32:18 · 669 阅读 · 0 评论 -
ref的用法-systemverilog
标题class transaction; rand bit[3:0]sig;endclassmodule top_tb; transaction tr1; transaction tr2;function disp1(transaction tr); $display("Creat out of func!")标题标题原创 2021-12-14 22:46:52 · 1173 阅读 · 0 评论 -
router(四)-Synopsys验证实验(OOP封装)
四、OOP封装将packet信息封装进packet class里;利用random在class里面随机产生sa、da和payload;创建两个packet对象,一个用于DUT,另一个用于重构DUT的输出;使用包嵌入去验证DUT的操作;在第三部分,我们已经添加了self-check的monitor,这个部分会把packet的相关信息封装到类的结构中,然后在generator创建一个随机的Packet对象然后send、receive和checkDUT在这个packet是否正确。4.1定义pac原创 2021-12-11 14:01:21 · 286 阅读 · 0 评论 -
router(三)-Synopsys验证实验(self-checking)
三、self-checking开发一个monitor(get_payload)去采样router的输出;开发一个checker去验证recv()得到的get_payload()得到的router的输出,通过对比size、元素等对比来验证;同时运行driver和monitor,也就是同时运行send()和recv();通过针对错误的 DUT 执行测试平台来验证自检机制3.1 build the top-level test environmentprogram automatic test(原创 2021-12-11 13:59:41 · 442 阅读 · 0 评论 -
router(二)-Synopsys验证实验(send packet)
二、sending packets through router这个模块会建立器simulus generator,protocol transactors and device driver,2.1发送数据相关定义通过router发送数据包l来指定使用哪个输入端口和输出端口,以及发送什么数据。,所以需要定义源地址sa,目标地址da,传输的数据payload;payload里面包含的数据是一个多个字节组成的[7:0] payload[$]其中[7:0]表示一个字节,[$]队列队列使用之前需要进行原创 2021-12-11 13:58:38 · 458 阅读 · 0 评论 -
router(一)-Synopsys验证实验(reset DUT)
一、reset DUT1.1 创建interface首先定义interface的时候可以直接把DUT里面的信号全部copy过来,然后把input/output都设为logic。声明一个由信号时钟的posedge驱动的时钟块。这个时钟块将被测试程序用来执行同步驱动器和样本。这个时钟块中信号的所有方向都必须与测试程序相关。注意在定义clocking block里不需要定义位宽,如果input/output前面定义了#2ns,那么default的设定就不起作用了;interface router_io(原创 2021-12-11 13:57:28 · 651 阅读 · 0 评论 -
对特定的fork进行有效disable(mask fork)-systemVerilog
一、disable fork终止父进程的说明`define DELAY 10module top_tb;bit valid;task taska(int delay);fork:thread_a begin:sub_thread_a $display("@%0t:ENTER SUB_THREAD_A",$time); wait(top_tb.valid == 1'b1); $display("@%0t:ENTER SUB_THREAD_A",$time); end:原创 2021-12-05 21:29:55 · 715 阅读 · 0 评论 -
this的用法(类的存放问题、静态方法中的情况、如何区分形参和对象属性)-systemverilog
一、类内的property和method的空间存放问题在面向对象语言中,可能会声明很多的对象,而我们通常会对当前自己的对象进行操作,这时需要一些符号表示对当前对象的引用。在类中方法[return_type]function_name(class_type const this,other_argsreturn_type>>>function的返回类型class_type>>>当前function所属的类other_arrgs>>>当前func原创 2021-12-04 00:17:29 · 492 阅读 · 0 评论 -
DPI(import和export的方法)-sv
DPI的全称就是Direct Programming Interface,总结来说就是systemverilog和其他语言的接口。这里主要是用于C的接口。允许SystemVerilog调用一个C函数,就像任何其他本地SystemVerilog函数/任务一样,除此之外变量直接从/传递到C/ c++。whySystemVerilog用户他们想要重用C/ c++设计和测试平台。DPI很容易将C/ c++代码连接到SVSystemVerilog可以调用C, C可以调用SV支持function和task原创 2021-11-30 22:46:36 · 2861 阅读 · 0 评论 -
覆盖率(covergroup触发、覆盖率数据采样(条件、翻转、wailcard、忽略))-sv
断言设计和验证都需要,范围:接口、FSM、标准协议、好处:缩短时间、监控设计端口的、可以集成为分类:立即(过程)、并行函数:每一个都需要敲一遍;SVA的层次:布尔表达式-sequence-property-assert,也就是他的flowspec提取逻辑关系-建立sequence-property-cover assert,方便注意:不能改设计代码,借助仿真器,可以映射RTL里面的信号,层次化引用,前提是TB和设计都是Verilogtb.c_inst.a_inst.sig1赋值给TB里面的原创 2021-11-27 21:47:59 · 6681 阅读 · 1 评论 -
关于@(posedge clk)和@(itf.cb)的区别
一、采样region区别@(posedge clk)采样是在active region,相当于observe region,这里会采样最新的值;@(itf.cb)采样会在prepone region二、具体示例代码在这里插入代码片原创 2021-11-23 20:21:56 · 4511 阅读 · 0 评论 -
随机约束、随机分布、随机数组等-systemverilog
一、简原创 2021-11-18 23:26:02 · 650 阅读 · 0 评论 -
并发线程和线程间通信(event、mailbox和semaphore)-systemVerilog
一、简介要了解什么是线程之前,我们要了解什么叫进程。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个线程。在实际硬件中,时序逻辑通过触发器和时钟来激活,组合逻辑通过输入变化而变化。在Verilog中也是通过initial和always、连续赋值语句等进行模拟。但是对于我们的验证环境来说,我们会使用许多并发执行的线程,这要求sv能够控制和不断选择下原创 2021-11-14 11:59:14 · 1385 阅读 · 0 评论 -
类的封装继承多态以及virtual interface-SV
回顾竞争与冒险timeslot:以事件调度进行仿真,哪一个事件进行需要顺序,需要层次化队列,Verilog:active-inactive–postponed,能够避免语句执行混乱,postponed区(#1 step)clocking 不只是在interface、module,不需要例化直接使用;clocking block ##1表示等待一个clocking block,或是在##n;一般情况下设计中不会使用clocking block,会在验证中使用;program里面循环:在initi原创 2021-11-09 17:01:02 · 2159 阅读 · 2 评论 -
systemverilog-interface(定义、modport、竞争与冒险、clocking、time region)
背景DUT和tb之间的port口的数量较多,很容易犯错,这里使用if,只需要将两端定义好就行了;声明interface arb_if(input bit clk);//类似module和endmodule,arb_if是interface名,portlist logic[1:0] grant,request;//三把线 logic grant_valid; logic rst;endinterfacemodule arb(arb_if arbif);//如果还是之前的连接input、原创 2021-11-06 16:49:53 · 3693 阅读 · 0 评论 -
system verilog-过程语句
过程语句always的主要是模拟硬件信号,需要对标硬件行为,只可以在module或者interface中使用;initial主要是模拟只执行一次,然后与always语句都是无法延迟执行,不同的initial和always之间是没有顺序可言的,他不可综合。always语块always语块是无限循环过程块—即每一个仿真周期都执行,但是由于verilog里面的always语句比较万能,所以在相应的信息表达精确度比较缺乏,需要通过内部的语句才能够确定,容易发生错误。always_comb代表时序逻辑原创 2021-11-02 21:39:07 · 618 阅读 · 0 评论 -
systemverilog-数据类型(logic、数组、队列、结构体、枚举类、字符串)
verilog中的数据变量可以映射到实际的硬件中的线网和变量,而systemverilog添加了一些新的变量能够软件和硬件相互联系。logic:在verilog中会有wire和reg,其中如何在不同的模块中使用,module logic_data_type(input logic rst_); parameter CYCLE = 20; logic q,q_l,d,clk,rst_l; intial begin clk = 0; forever # (CYCLE/2) clk = ~原创 2021-09-29 20:38:43 · 2244 阅读 · 0 评论 -
system Verilog-验证的思想
目的:一个好的硬件设计,会有他所需要达到的功能,我们进行硬件设计的验证时,需要确保它能够完成预定的任务。不同层次上进行测试:可以先进行设计代码中的block->module->总线事务->数据传输的情况验证;代码块的边界需要考虑,可能是不同人对一个总线传输协议理解不一样,需要找到两者的区别;对基本的设计的RTL代码看完后,可以进行仿真,之后需要模拟周围代码可能会有的激励。但是这个找激励的情况可能会随着模块的数量逐渐增大。对最高层次的DUT来说,可能可以进行非常精细的激励测试.原创 2021-09-29 18:08:00 · 409 阅读 · 0 评论