【数字IC前端】学习随笔(2)

Q1:验证一些模块时,往往要考虑有关数据反压、读后写、写后读等等情况,为什么要这么考虑?

A1: 考虑这些情况,往往是我们想到了模块可能被以什么情况来操作,但是在有关计算机体系结构的教科书中,在指令集并行有关的章节中提到了数据冒险的概念。

  • 数据冒险是指指令间存在相关性并且这两条指令相聚非常接近,足以使执行期间的重叠改变相关操作数的访问顺序,数据冒险分成三类:
  1. RAW写后读:j在i还没写入时就读取同一位置,会读取旧值
  2. WAW写后写:j在i还没写入时就写入同一位置,会被i写入覆盖(存在于i指令执行时间较长,如浮点运算或乘法指令)
  3. WAR读后写:j在i还没读入时就写入同一位置,i错误读取新值(一般先读后写的指令集不会出现,可能情况是j提前写而i在流水线后期才读的情况)
  • 如果不是做ASIC,而是和SoC关联更大的数字IC,还是要多了解体系结构的内容,无论是设计和验证还是都要对有些知识的来源搞清楚。

Q2: interface中声明的clokcing块和采样的时钟信号如何进行信号的同步和采样,从而避免时钟的竞争问题?

A2: 为了避免在RTL仿真行为中发生的信号竞争问题,常采用非阻塞赋值或者特定的信号延迟来解决同步问题。而clocking块基于时钟周期对信号进行驱动或者采样的方式,可使得testbnch不用纠结于如何准确及时的对信号驱动或者采样,从而可以消除信号竞争问题。
eg:

clocking bus @(posedge clock1);
	default input #10ns output #2ns; 
	input data, ready, enable; 
	output negedge ack; 
	input #1step addr; 
endclocking
  • 第一行定义了一个clocking块bus由clock1的上升沿来驱动和采样
  • 第二行指出了在clocking块中所有的信号,默认情况下会在clocking事件(clock1上升沿)的前10ns来对其进行输入采样;在事件的后2ns对其进行输出驱动
  • 下一行是声明了要对其采样的三个输入信号,data,ready和enable信号,这三个信号作为输入,它们的采样事件即采用了默认输入事件(clock1上升沿前的10ns)。
  • 第四行声明了要驱动的ack信号,而驱动该信号的事件是时钟clock1的下降沿,即覆盖了原有的默认输出事件(clock1上升沿后的2ns)接下来的addr,也采用了自身定义的采样事件,即clock1上升沿前的1step。这里的1step会使得采样发生在clock1上升沿的上一个的间片采样区域,即可以保证采样到的数据是上一个时钟周期的数据。
  • 注: interface中添加多个clocking定义,且同一个变量在不同的clocking中可以声明不同的方向

背景代码举例:
timescale 1ns/1ps initial begin //产生时钟clk1 forever#5 clk1 <=!clkl; end //产生时钟clk2 always@(clk1) clk2 <= clk1; end initial begin #10 rstn <= 0; #20 rstn <= 1; end always@(posedge clk1,negedge rstn)begin if (!rstn) d1 <= 0; else d1 <= d1 + 1; end // 在c1k1,clk2上升沿打印出d1的数值 always@(posedge clk1) $display("%0t ns d1 value is 0x%0x",$time,d1); always@(posedge clk2) $display("%0t ns d1 value is 0x%0x",$time,d1);

  • 该段伪代码中,若40ns时,clk1在上升沿处采样得到d1的数值为1,则clk2在40ns处采样得到的d1数值:在波形图上,d1显示为2(实际上此绝对时刻应为1,加上delta时间后才会为2),且clk1和clk2播行会发生几乎重合的现象,无法清晰判断先后。基于此可以在波形中插入delta-cycle,用于得到更准确的时钟关系。

Q3: interface与module的关系?

A3: module里面可以做的事情,9成以上的东西都可以在interface里面做。

  • 以下语句均可以在interface和module里面定义的有: 参数、输入输出端口、函数和任务、过程语句块等。

  • module和interface的差别: module里面可以例化module和interfac;但是interface仅可以例化interface,而不可以例化module。 这是因为 module作为数据交互传递的组件,肯定可以例化模块和嵌套模块以及例化连接接口;而高一级的接口可以例化嵌套子一级的接口,但是它仅作为数据传递的媒介,没有办法去例化模块。

  • 软硬件的连接可以用interface也可以用modport 限制信号传输方向,从而避免端口连接的错误。

Q4: Program和module的使用?

**A4: ** 通常,将设计部分内容放置在module中(硬件实现),而将测试采样部分放置在program中(软件实现)。

  • 这是因为通常可将program看做是软件的"领地",所以program中不可以出现和硬件行为相关的过程语句和实例,例如always,module interface,也不应该出现其它program例化语句。

    • 为了使得program进行类软件方式的顺序执行方式,可以在program内部定义变量,以及发起多个initial块
    • program内部定义的变量赋值的方式应该采用阻塞赋值(软件方式)
    • program内部在驱动外部的硬件信号时应该使用非阻塞赋值(硬件方式)
  • 基于UVM的验证主要还是用interface多一些,应当是关注的重点。

Q5: SV中的Package?import与`include?

A5: Package将不同的组件放到一个容器里,避免之后调用时,遇到类名/方法/实例重复等问题。在使用时,需要使用`include。

  • 对于两个不同package相同的类名,我们可以在引用类名的时候通过域名索引"::"操作符的方式来显式指出所引用的同一个名称的类具体来自于哪一个package,这样便能很好地通过不同名的package来管理同名的类。即package这个容器可以对类名做一个隔离的作用
  • package更多的意义在于将软件(类、类型、方法等)封装在不同的命名空间中,以此来与全局的命名空间进行隔离。package需要额外定义,容纳各种数据、方法和类。
  • library是编译的产物,在没有介绍软件之前,硬件(module interface,program)都会编译到库中,如果不指定编译库的话,会被编译进入默认的库中。从容纳的类型来看,库既可以容纳硬件类型,也可以容纳软件类型,例如类和方法,也包括package.
  • 在创建package的时候,已经在指定包名称的时候隐含地指定了包的默认路径,即包文件所在的路径。如果有其它要被包含在包内的文件在默认路径之外,需要在编译包的时候加上额外指定的搜寻路径选项"+incdir+PATH".
  • 如果遵循package的命名习惯,不但要求定义的package名称独一无二,其内部定义的类也应该尽可能地独一无二。例如,A_pkg和B_pkg中有同名的类,这些类如果携带类名的前缀,那么后面的处理会变得更容易一些
  • 如果不同package中定义的类名也不相同时,在顶层的引用也可以通过"import pkg_name::"的形式,来表示在module xxx-tb中引用的类如果在当前域(xxx内部)中没有定义的话,会搜寻A_pkg和B_pkg中定义的类,又由于它们各自包含的类名不相同,因此也无需担心下面的搜寻会遇到同名类发生冲突的问题。

包的使用

  • 在包中可以定义类、静态方法和静态变量,如果将类封装在某一个包中,那么它就不应该在其它地方编译,这么做的好处在于之后对类的引用更加方便。
  • 类和包是好朋友,包是类的归宿,类是包的子民。
  • 包里编译的类型可以导入到其他域,这些域包括 module、interface、program、class(软硬件域)、包(本身也是个域)。
  • 一个完整模块的验证环境组件类,应该由一个对应的模块包来封装。使用“`include”的关键词完成类在包中的封装,要注意编译的前后顺序来放置各个include的类文件。
  • 包在编译完后会放入库中。
  • 编译一个包的背后实际是将各个类文件"平铺"在包中,按照顺序完成包和各个类的有序编译。
  • 使用类的可以通过`import完成包中所有或者某一个类的导入,使得新的环境可以识别出该类,否则类会躺在包这个盒子里不被外部识别。

Q6:SystemVerilog的Property用法

  • Property(属性)定义设计的行为。 命名的属性可以用作assumption, an obligation, or a coverage specification说明以进行验证工作。 为了使用该行为进行验证,必须使用assert, assume, or cover声明。Property声明本身不会产生任何结果。
  • propert在这些模块里均可以声明:A module; An interface;A program; A clocking block; A package; A compilation-unit scope; A generate block; A checker

Q7: 一些SystemVerilog 运算符

Q8:Stimulation Region

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值