赞
踩
目录
Q32.packed array和unpacked array的区别
Q41.illegal_bins和ignore_bins命中分别会怎么样?命中是否会计入覆盖率统计
如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。
如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。
队列常用的使用方法:insert,delete, push_back和pop_front
Push插入,pop取出
Front前边,back后边
类中如果没有指明访问类型,那么成员的默认类型是public,子类和外部均可以访问成员。
如果指明了访问类型是protected,那么只有该类或者子类可以访问成员,而外部无法访问。
如果指明了访问类型是local,那么只有该类可以访问成员,子类和外部均无法访问。
1.打印显示
2.设置断点
3.波形分析
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。
亚稳态违背了时序,无法在规定的时间内达到稳定,且亚稳态具有传输功能,会传递给后一级的触发器,从而导致电路出错。亚稳态最后会稳定下来,但是所需的时间较长。
二进制码:基本的机器语言,每一位只能是0或1,逢二进一;
格雷码:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”。
独热码:又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
packed array的声明方式:bit [7:0][3:0] packed_array:表示packed_array有4个8比特数组成,且存储空间连续;
unpacked array的声明方式:bit [7:0] unpacked_array[3:0]:表示unpacked_array有4个8比特数组成,存储空间不连续;
阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”)
阻塞:一般对应电路中的组合逻辑赋值,等号右端的结果会立刻赋值给左端。
非阻塞:一般对应电路中的时序逻辑赋值,等号右端的结果不会立刻赋值给左端。
在always语句中,阻塞赋值等号左端的参数如果参与该模块的其他运算,则按照赋值后的结果参与运算,而非阻塞赋值等号左端的参数依旧按照未赋值前的结果参与运算。
Assign语句中用阻塞赋值,
组合电路用阻塞赋值,时序电路用非阻塞赋值
- 连续赋值语句由assign来标示,而过程赋值语句不能包含这个关键词;
- 连续赋值语句中左侧的数据类型必须是线网数据类型,而过程赋值语句中的被赋值数据类型则必须是寄存器类型的变量;
- 连续赋值语句不能出现在过程块(initial或always)中,而过程赋值语句可以;
- 连续赋值语句主要用来对组合逻辑电路进行建模以及对线网数据间的连接进行描述,而过程赋值语句主要用来对时序逻辑电路进行行为描述;
- 连续赋值语句对被赋值线网型数据的赋值是“连续”的(即赋值表达式的任何变化都会在立刻反应在线网数据的取值上),而过程性赋值语句,只有在过程赋值语句被执行时才执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响(注意这里的一次是指:在initial块中,过程性赋值只顺序执行一次,而在always块中,每一次满足always的条件时,都要顺序执行一次该always块中的语句。)。
always:
- always是为了描述硬件的行为,而在使用时需要注意哪种使用方式是时序电路描述,哪种使用方式是组合电路描述。
- always中的@(event..)敏感列表是为了模拟硬件信号的触发行为,需要正确对标硬件行为和always过程块描述。
- 所以说,always过程块是用来描述硬件时序电路和组合电路的正确打开方式,因此只可以在module或者interface中使用。
initial:
- initial从名字也可以看得出来,与always在执行路径上有明显区别,即initial非常符合软件的执行方式,即只执行一次。
- initial和always一样,无法被延迟执行,即在仿真一开始它们都会同时执行,而不同initial和always之间在执行顺序上是没有顺序可言的。
- initial从其执行路径的属性来看,它不应该存在于硬件设计代码中,它本身不可综合,对于描述电路没有任何帮助。
- initial就是为了测试而生的,由于测试需要按照时间顺序的习惯即软件方式来完成,所以initial便可以实现这一要求。
- 在Verilog时代,所有的测试语句都可以被放置在initial中,为了便于统一管理测试顺序,建议将有关测试语句都放置在同一个initial过程块中。
- initial过程块可以在module、interface和program中使用。对于过程块的书写方式,请记住用begin..end将其作用域包住。
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
(1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
(3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
用触发器是因为触发器能保存数据,保存电路状态;触发器是在时钟边沿触发,用时钟同步是让整个电路能同步整齐划一的工作;另外,如果只用组合逻辑,无法保存数据,这样得到的数据无法供以后使用。
同步复位:当时钟上升沿检测到复位信号,执行复位操作,时钟沿有效是前提 。always@(posedge clk);
优点:
a、有利于仿真器的仿真;
b、可以使所设计的系统成为 100% 的同步时序电路,有利于时序分析,而且可综合出较高的 Fmax;
c、由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。缺点:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如 clk skew 、组合逻辑路径延时 、复位延时等因素(所以复位信号有时需要脉冲展宽,用以保证时钟有效期间有足够的复位宽度);
b、由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。异步复位:
无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。always @ ( posedge clk or negedge rst_n )
;优点:
a、大多数目标器件库的 DFF 都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;
b、设计相对简单;
c、异步复位信号识别方便(电路在任何情况下都能复位而不管是否有时钟出现)。缺点:
a、最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是0是1是不确定的),从而导致复位失败。
b、可能因为噪声或者毛刺造成虚假复位信号(比如以前的游戏机玩到一半突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);
c、静态定时分析比较困难。
d、对于 DFT (Design For Test可测性设计)设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。推荐使用异步复位、同步释放的方式,并且复位信号为低电平有效
- module reset_gen ( output rst_sync_n, input clk, rst_async_n);
- reg rst_s1, rst_s2;
- wire rst_sync_n ;
-
- always @ (posedge clk or negedge rst_async_n) begin
- if (!rst_async_n) begin
- rst_s1 <= 1'b0;
- rst_s2 <= 1'b0;
- end
- else begin
- rst_s1 <= 1'b1;
- rst_s2 <= rst_s1;
- end
- end
-
- assign rst_sync_n = rst_s2;
-
- endmodule
详细解释点击
分为组合逻辑电路和时序逻辑电路。
组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
而时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关
illegal_bins 表示非法的bin,如果采样命中会报错;
ignore_bins 表示忽略的bin,如果采样命中直接忽略,并不计入覆盖率统计。
负数采用二进制的补码形式表示,最高位的0表示正,1表示负;
例如-1,1的原码为0001,反码为1110,补码为1111,,1111表示-1.
对应0
this表示指向本身的指针,通过this可以绑定方法和对象,可以区分方法体的形参和对象成员,this只能作为实参传递,this的生命周期从调用方法开始存在,当方法结束生命周期也随之结束,this只能应用于动态生命周期,不能应用于static中。
super主要用于在子类中访问父类的属性和方法。
器件配置:通过寄存器和系统信号;
环境配置:随机化验证环境,例如:合理的时钟和外部反馈信号;
原始输入数据:例如数据包的长度,宽度,数据发送的顺序;
延时:握手信号之间的时序关系,例如:vaild和ready,req和ack之间的时序关系;
异常协议
可以通过for/foreach遍历数组的方法打印返回
在clocking block中,实际上指定了默认的input偏差和output偏差,只不过这个偏差在宏观的时间刻度上观察不到,对输入性质的信号指定的默认采样时间是1step,对于输出性质的信号指定的默认驱动时间为0,其中1step是一个较为特殊的时间单位,一般指输入信号在采样信号事件发生之前的输入信号的稳定值,可以认为1step实际采样时刻发生在上一时间槽的最后时刻,1step不像ns、ps等之类可以用来设置设计的时间精度和时间单位,它指定了当前采样值来自于当前时间槽的pre-pone区,0则表示在采样事件发生后立刻将对应的值驱动到输出端口,与1step不同的是,该时刻的采样发生在采样事件发生的当前时间槽的Observed Region。
另外,也可以自定义,例如:default input 1ns output 1ns
并发断言的用法的话,主要是有三个层次:
第一是布尔表达式,布尔表达式是组成断言的最小单元,断言可以由多个逻辑事件组成,这些逻辑事件可以是简单的布尔表达式.在SVA中,信号或事件可以使用常用的操作符,如:&&, ||, !, ^,&等;
第二个序列sequence编写,sequence是布尔表达式更高一层的单元,一个sequence中可以包含若干个布尔表达式,同时在sequence中可以使用一些新的操作符,如 ## 、重复操作符、序列操作符;
第三个是属性property的编写,property是比sequence更高一层的单元,也是构成断言最常用的模块,其中最重要的性质是可以在property中使用蕴含操作符(|-> |=>);
可以通过立即断言检查随机化是否成功
例如 assert(p.randomize()) 来检查p句柄指向的实例是否实例化成功;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。