ZTE期间-学习笔记

运行.sv文件:b_run xrun 文件.sv

20201218:
Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。
执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。

10个分支:NC/VCS(rtl,asic,xprop,dft,sdf)
VCS® Xprop 旨在帮助寻找 RTL 中的 X 相关问题,减少对冗长的门级仿真的需求。(https://www.synopsys.com/zh-cn/verification/simulation/vcs-xprop.html)
在 VCS Xprop 仿真中,同样的时钟转换将导致触发器合并输入和输出,从而可能导致未知的值。因此,要想有效地将新值加载到触发器,您必须确保时钟信号的值有效且稳定,这样的情况将通过启用 VCS Xprop 的仿真显示在 RTL 运行中。

首先SDF(Standard Delay File)文件里面包含了一些器件的固有延迟,内部连线的延迟,端口延迟,时序确认信;
息,时序约束信息和脉宽控制信息等内容。
VCS读取SDF文件实际上就是延迟信息的一个反标过程。VCS通过读取SDF文件里面的延
迟值,从而改变原文件的默认延迟值(通常是由原文件默认指定,如果原文件没有指定那么
就是采用仿真工具默认指定的延迟值)。

数字EDA仿真软件常用的有三家 (big 3),
Synopsys的vcs, (Verilog Compiler Simulator)
Cadence的NCsim (Incisive Enterprise Simulator的core simulation engine), 和
Mentor Graphics的ModelSim/Questa.
NC/NCsim的意思是 native compiled simulator. 
native的意思应该就是表示, ncsim编译Verilog时, 将它编译成 只能run在本机 或 同类型机器 上, 而非一个放在任何平台都可以run. 当然了, EDA编译输出一般也没必要支持跨平台, 所以也没必要cross compiler.
ncsim中的compile是什么意思呢?

从文献[1]可以知道,verilog仿真器主要有如下两种:编译型和解释型两种。
Compiled Simulator : This kind of simulator converts the whole Verilog code into machine dependent code and then runs the simulation. Example : VCS generates the binary file, which can be run from the command prompt. Compiled simulators are very fast.
Interpreted Simulator : This kind of simulator executes line by line, thus is very slow compared to a compiled simulator. Verilog-XL is one such simulator.
从文献[2]和[3]可以知道,目前的big 3:ncsim中的NC-Verilog、vcs和modelsim都是compiled Verilog simulator。Interpreted Simulator是一行一行地解释执行。


VCS是编译型verilog仿真器,处理verilog的源码过程如下
VCS先将verilog/systemverilog文件转化为C文件,在linux下编译链接生成可执行文件,在linux下运行simv即可得到仿真结果。
编译命令的格式:vcs sourcefile [compile_time_option] (编译选项用来控制编译过程)
./simv -l run.log 开始仿真,testbench里的$display打印仿真成功的信息,显示在终端上。使用-l run.log 记录终端上产生的信息。
考虑一种情形,当使用到VCS更多其他功能时,编译选项会变得很长,在终端上一个一个敲变得十分不方便,我们便可以使用makefile来帮助我们编译仿真。在工作目录下新建一个makefile文件
Makefile
VCS = vcs -sverilog +v2k -timescale=1ns/1ns                             \
      -debug_all                            \
      -o ${OUTPUT}                            \
      -l compile.log                        \

SIM = ./${OUTPUT} -l run.log

com:
【tab】  ${VCS} -f verilog_file.f

sim:
    ${SIM}


2020 12 22
空口是基站和移动电话之间的无线传输规范,定义每个无线信道的使用频率、带宽、接入时机、编码方法以及越区切换

数字低通滤波器有两种形式,IIR和FIR。
IIR是无限脉冲响应滤波器,它的特点是输出与无限久以前的输入有关。这就如同上面RC滤波器的响应,随着时间流逝,输出电压只会无限接近于输入电压,而不会等于。
IIR的特点是节省内存,上面的滤波器只使用了两个变量。
IIR的缺点是不稳定。
FIR是有限脉冲响应滤波器,它的特点是输出与有限久以前(一段时间内)的输入有关。由于数字系统中采样是离散的,每一段时间内的采样数是固定的,所以FIR滤波器的每一个输出值,可通过对之前的若干个数量固定的采样值进行计算得到。
相对的,IIR滤波器不依赖之前的采样,但依赖于之前的滤波器状态(存在反馈),因此在大部分比一阶低通滤波器复杂的应用场合,IIR滤波器的各项特性没有FIR稳定(若要实现稳定,对计算精度要求较高),而且计算起来比FIR要慢,设计上也没有通用性。

2020 12 23
https://www.e-learn.cn/topic/3354032
Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别
**阻塞赋值:**前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。
**非阻塞赋值:**always块内,2条语句同时执行。即:前面语句的执行(b=a)不会阻塞后面语句的执行(c=b)。
组合逻辑电路:使用阻塞赋值(“=”);时序逻辑电路:使用非阻塞赋值(“<=”)
verilog编写代码的8个原则,记住这八点可以避免90%以上的冒险竞争
(1) 时序电路建模时,用非阻塞赋值。
(2) 锁存器电路建模时,用非阻塞赋值。
(3) 用always块建立组合逻辑模型时,用阻塞赋值。
(4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
(5) 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

组合逻辑电路可以有若个输入变量和若干个输出变量,其每个输出变量是其输入的逻辑函数,其每个时刻的输出变量的状态仅与当时的输入变量的状态有关,与本输出的原来状态及输入的原状态无关,也就是输入状态的变化立即反映在输出状态的变化。时序逻辑电路任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。也就是说,组合逻辑电路没有记忆功能,而时序电路具有记忆功能。

时序逻辑电路简称时序电路,它是由最基本的逻辑门电路加上反馈逻辑回路(输出到输入)或器件组合而成的电路,与组合电路最本质的区别在于时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。它类似于含储能元件的电感或电容的电路,如触发器、锁存器、计数器、移位寄存器、储存器等电路都是时序电路的典型器件。

2.组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
3.时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。

starting_phase:
phase是属于component的一个概念。因此用starting_phase != null来判断。starting_phase实际上是uvm_sequence指向phase的一个指针,当sequencer在main_phase中启动default_sequence时,sequencer就将phase赋值给sequence中的这个指针,从而满足了starting_phase!= null的这个条件。
suquence是object是没有phase的,所以需要通过starting_phase把phase指针传递给sequence
在sequence中,判断starting_phase!=null,通过raise_objection,drop_objection控制验证平台的开关
一个sequence如果不是sequencer的default_sequence,其starting_phase=null,如果其caller有starting_phase,可以从其parent get到starting_phase,从而可以实现rAIse/drop_objection的操作。

2020 12 28
create是用factory模式来construct对象,在factory中注册过的uvm_object扩展类或是uvm_component 扩展类都可以用create,这样做的好处是在testcase里面可以override.  new是什么时候都可以用的。
当你使用了uvm_component_utils注册了之后就可以使用类似于A=example::type_id::create(“a”,this)的形式,create其实是factory重载了new函数,是factory方式实例化;如果你没有使用uvm_component_utils去注册,则只能使用systemverilog的new函数去实例化了,但是使用create产生的实例可以使用uvm的很多功能,比如overide功能(set_type_override_by_type(a1::get_type(),a2::get_type()))。使用上的区别可以这样简单理解,但是,如果觉得还想深入了解请阅读uvm factory源码。
链接:https://www.jianshu.com/p/8ad30803364f

2020 12 29 
1. sequence机制:提供了一种sequence--sequencer--driver的单向数据传输机制。driver可以给回一个反馈到seq。

2.for循环里的break,continue和return有什么差别
break: 此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环。如果break语句包含在嵌套循环里,它只跳出最里面的循环。
continue:循环语句里有此语句时,程序运行到此语句时,不在执行循环体里continue后面的语句而是跳到下一个循环入口处执行下一个循环。
return是表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。return后函数就结束了,后面的语句不再执行

3.get_full_name()
获取这个节点的完整层次,这函数在object中就有定义,但是在component类中进行了重载,实现输出从uvm_test_top到当前节点的路径(是通过执行m_set_full_name是保存路径在m_name中)。返回值如:env.agt.drv(这些名字不是类名,是实例名字)

4.get()
这个函数在很多类中都有,比如uvm_object_register #(T,Tname)和uvm_factory都要这个get()函数,这个函数都是通过单例模式返回这个类的唯一对象。

5.get_name()
获取当前节点的实例名字,(不是类名)

6.get_type_name()
获取类的名字,以string形式返回,这个string是在注册的时候产生的。

7.get_type()
这个函数是类在注册的时候产生的静态函数,通过这个函数获取的是一个uvm_object_registry或者uvm_component_registry的单例对象,通过这个对象,其实跟调用get()函数功能差不多,只是调用get()函数得到的是uvm_object_wrapper对象,而调用get_type则将uvm_object_wrapper转换成了子类类型,uvm_object_registry #(T,Tname)。

8.流操作符与移位操作符
流操作符(bit-stream),表示方式为{>>{}} 和 {<<{}}。前者会把数据块按照从左到右的形式流(stream),后者则是从右到左。实际项目中,经常需要打包(pack)和解包(unpack)数据。

>>和>>>不一样 >>是逻辑右移 补零 >>>是算数右移 根据数据是有符号或无符号类型判断补符号位或零

2020 12 31 
1.C shell
setenv 用于设置环境变量(作用于所有用户进程)。
set    用于设置当前shell中的自定义变dao量,如 set var=xxx;若set命令不加参数,可列出当前所有环境变量。
在csh中环境变量的赋值(setenv)没有等号, 而内部变量的赋值(set)有等号。
最大的区别是,set变量只对当前进程有效,不会传递给子进程
setenv变量不仅对当前进程有效,而且会传递给子进程
而当同时使用set和setenv设置一个变量时,当前进程中,会优先使用set设置的值
2.UVM:寄存器模型
寄存器模型中的寄存器值应该与DUT保持同步,但是由于DUT的值是实时更新的,所以寄存器模型并不能实时知道这种更新,在寄存器模型中专门有个值来尽可能与DUT中寄存器的值保持一致,叫镜像值(mirrorred value)。寄存器模型中还有一个值叫期望值(respected value),这个值保存我们希望写入寄存器的值。
自动预测(auto prediction)
如果用户并没有集成独立的predictor在环境中,而是利用寄存器的操作来自动记录每一次寄存器的读写数值,并在后台自动调用predict()方法的话,这种方式被称之为自动预测。
显式预测(explicit prediction)
更为可靠的一种方式是在物理总线上通过监视器来捕捉总线事务,并将捕捉到的事务传递给外部例化的predictor(预测器)。该predictor由UVM参数化类uvm_reg_predictor例化并集成在顶层环境中。在集成的过程中,需要将adapter与map的句柄也一并传递给predictor,同时将monitor采集好的事务通过analysis port接入到predictor一侧。这种集成关系可以使得,monitor一旦捕捉到有效事务,会发送给predicotr,再尤其利用adapter的桥接方法,实现事务信息转换,并将转化后的寄存器模型有关信息更新到map中。默认情况下,系统将采用显式预测的方式,这就要求集成到环境中的总线UVC的monitor需要具备捕捉事务功能和对应的analysis port,以便于predictor连接。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值