文档库 最新最全的文档下载
当前位置:文档库 › Verilog的delay与阻塞or非阻塞的仿真

Verilog的delay与阻塞or非阻塞的仿真

Verilog的delay与阻塞or非阻塞的仿真
Verilog的delay与阻塞or非阻塞的仿真

仿真、延迟时序ftang 代码技巧

用【$display()】+【$time】

引入【$display()】对仿真的影响------display若打印变量、变量也作为敏感信号无$display()时候

【$monitor()类似】

有$display()时候+$display()不使用变量===不会影响逻辑

例子

---------------2个变量

例子1=阻塞+delay在右侧==【process在sleep期间忽略其他事件+唤醒后使用old 右值】

在T=100时,触发always块的process执行

#50会导致该process进入sleep

且因为是=阻塞赋值,则在该process过程中、其不会被新的事件唤醒【也阻塞其他事件】当该process被唤醒的时候,使用旧的右值、并赋给左值【右侧delay使用旧值】

例子1续=阻塞+delay在右侧==【更清晰看出sleep期间忽略新的事件】

在T=100时候,#50导致process进入sleep------sleep期间忽略、其他事件

例子2=阻塞+delay在左侧==【process在sleep期间忽略其他事件+唤醒后使用new 右值】

在T=100时,触发always块的process执行

#50导致该线程进入睡眠-----在睡眠会忽略其他的事件【添加$display()可知】

例子3=非阻塞+delay在右侧==【process立即返回+对new事件敏感+使用old值】

在T=100时,触发always块的process执行

#50会导致该process进入sleep

且因为是<=非阻塞赋值,则不会阻塞后面的语句执行,因后面没有语句该process相当于立即返回【若加打印可以看的比较清楚,立即返回了】

在T=120时,因该process返回了,则可以被再次触发

对比=若后面还有其他阻塞语句话【如#30】,则该process不会立即返回------在sleep期间、会忽略新的事件

例子4=非阻塞+delay在左侧==

在T=100时,触发always块的process执行

因为#50在左侧=则该process进入sleep------在sleep期间、忽略新的触发事件【则上面提取的概念】

--------sleep方面+process返回

【整个process做sleep】+【部分子式做sleep,但process返回】

【process做sleep】与【process返回】-----process返回后,才会响应new触发事件----------实例

阻塞赋值----会阻塞整个process,导致process不能返回

【left = right】

【left=#delay right】会先计算right,在做赋值

#delay在左侧-----会阻塞整个process

-------------------3个变量

例子a1=阻塞+delay在右侧+级联

在T=100时,触发always块的process执行

#50导致process做sleep

在process Wakeup后,做更新leftValue的操作【先计算右值+产生update事件+process做sleep+唤醒后更新左值+再做本process后面操作】

在T=150时,process唤醒

因第1条语句是阻塞、则process没有返回的----执行完b更新后、b的值变化

但第2句仍为阻塞赋值、则其阻塞process返回-----则前面的b变化、不会导致process重新

被触发

对比=若第2句为非阻塞、则在T=150时候,先计算第2句右值+process返回+再更新第2句左值【因b在第1句更新的、那时process未返回,则也不会触发新的process】

再对比=非阻塞赋值,是先process返回、再执行更新左值

例子a2=阻塞+delay在右侧+平行

例子a3=阻塞+delay在左侧+级联

阻塞=会阻塞process的返回+阻塞process返回前、对敏感信号的响应

例子a4=阻塞+delay在左侧+平行

例子a5=非阻塞+delay在右侧+级联

modelsim和NCverilog的区别

Modelsim和NCverilog的比较 集成电路的发展趋势是,单位面积集成的晶体管的数目越来越多,可靠性越来越越高、稳定性越来越好。现在芯片集成度已经超出可人们的想象,有的芯片内部集成了数百万的晶体管,已经远远超出了人的大脑可以分析的范围。这就对EDA工具提出了更高的要求,不管是设计、仿真、综合软件的发展,都给集成电路工程师带来了巨大的便利。 modelsim是Mentor graphics公司推出的HDL代码仿真工具,也是业界最流行的HDL仿真工具之一。支持图形界面操作和脚本操作,常见的图形界面操作相对直观,但是由于重复性操作几率高、处理效率低、工程的非保存性,对于大规模的代码仿真不推荐使用;脚本操作完全可以克服以上的缺点,把常见的命令,比如库文件和RTL加载、仿真、波形显示等命令编辑成.do脚本文件,只需要让Modelsim运行.do文件即可以完成仿真,智能化程度高。 NCverilog是candence公司推出的Verilog HDL的仿真工具。NC-Verilog是Verilog-XL的升级版, 它采用Native-Compiled技术, 无论仿真速度, 处理庞大设计能力, 编辑能力, 记忆体容量和侦错环境都以倍数升级。C-Verilog是一个编译仿真器,它把Verilog代码编译成Verilog程序的定制仿真器。也就是它把Verilog 代码转换成一个C程序,然后再把该C程序编译成仿真器。因此它启动得稍微慢一些,但这样生成的编译仿真器运行得要比Verilog-XL的解释仿真器快很多。Ncverilog是shell版的,nclaunch是以图形界面为基础的,二者调用相同内核;Ncverilog的执行有三步模式和单步模式,在nclaunch中对应multiple step和single step;Ncverilog的三步模式为:ncvlog(编译) ncelab(建立snapshot文件) ncsim(对snapshot文件进行仿真)基于shell的ncverilog操作(尤其是单步模式)更适合于大批量操作,hncverilog的波形查看配套软件是simvision,其中包含原理图、波形、信号流等查看方式。 Ncverilog命令使用库文件或库目录 ex). ncverilog -f run.f -v lib/lib.v -y lib2 +libext+.v //一般编译文件在run.f 中, 库文件在lib.v中,lib2目录中的.v文件系统自动搜索使用库文件或库目录,只编译需要的模块而不必全部编译。 Verilog Testbench信号记录的系统任务: 1). SHM数据库可以记录在设计仿真过程中信号的变化. 它只在probes有效的时间内记录你set probe on的信号的变化。 ex). $shm_open("waves.shm"); //打开波形数据库 $shm_probe(top, "AS"); // set probe on "top" 第二个参数: A -- signals of the specific scrope

Ncverilog_的一些经验

Ncverilog 的一些经验 1.Verilog和Ncverilog命令使用库文件或库目录 ex). ncverilog -f run.f -v lib/lib.v -y lib2 +libext+.v //一般编译文件在run.f中, 库文件在lib.v中,lib2目录中的.v文件系统自动搜索使用库文件或库目录,只编译需要的模块而不必全部编译 2.Verilog Testbench信号记录的系统任务: 1). SHM数据库可以记录在设计仿真过程中信号的变化. 它只在probes有效的时间内记录你set probe on的信号的变化. ex). $shm_open("waves.shm"); //打开波形数据库 $shm_probe(top, "AS"); // set probe on "top", 第二个参数: A -- signals of the specific sc rope S -- Ports of the specified s cope and below, excluding library cells C -- Ports of the specified s cope and below, including library cells AS -- Signals of the specifie d scope and below, excluding library cells AC -- Signals of the specifie d scope and below, including library cells 还有一个 M ,表示当前scope的m emories, 可以跟上面的结合使用, "AM" "AMS" "AMC" 什么都不加表示当前scope的por ts; $shm_close //关闭数据库 2). VCD数据库也可以记录在设计仿真过程中信号的变化. 它只记录你选择的信号的变化. ex). $dumpfile("filename"); //打开数据库 $dumpvars(1, top.u1); //scope = top.u1, depth = 1 第一个参数表示深度, 为0时记录所有深度; 第二个参数表示scope,省略时表当前的scope. $dumpvars; //depth = all scope = all $dumpvars(0); //depth = all scope = current $dumpvars(1, top.u1); //depth = 1 scope = top. u1 $dumpoff //暂停记录数据改变,信号变化不写入库文件中 $dumpon //重新恢复记录 3). Debussy fsdb数据库也可以记录信号的变化,它的优势是可以跟debus sy结合,方便调试.

Verilog可综合与不可综合语句汇总

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

非常有用的将参数从verilog传送到c

非常有用的将参数从verilog传送到c 自行寫一個System Task,能夠接受由Verilog的reg或wire傳給C的值。 Introduction 使用環境: Cadense NC-Verilog 5.4 + Visual C++ 6.0 在此文件,將學習到 1.如何將參數從Verilog傳到C? 2.如何撰寫簡單的compiletf? 3.如何從C抓到Verilog傳來的參數? show_value.c / C 1#include 2#include "vpi_user.h" 3 4PLI_INT32 show_value_compiletf(PLI_BYTE8 *user_data) { 5 vpiHandle systf_handle, arg_iterator, arg_handle; 6 PLI_INT32 arg_type; 7 8// obtain a handle to the system task instance 9 systf_handle = vpi_handle(vpiSysTfCall, NULL); 10if (systf_handle == NULL) { 11 vpi_printf("ERROR: $show_value failed to obtain systf handle\n"); 12 vpi_control(vpiFinish, 0); 13 14return -1; 15 } 16 17// obtain handles to system task arguments 18 arg_iterator = vpi_iterate(vpiArgument, systf_handle);

verilog不可被综合的语句

verilog 不可综合语句总结汇总 2009-04-20 18:37 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。 (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 不可综合verilog语句2009-04-14 19:33

NCveriog安装指南

Ncverilog 安装指南 一。eda安装环境的搭建(建议) 1 在主文件夹下建立soft文件夹,里面建立edasoft文件夹,在edasoft下建立source.source文件用来保存软件的配置。 2打开source.source文件,输入下面内容: export EDA_HOME=~/soft/edasoft 关闭保存。 3在终端执行: gedit ~/.bashrc 打开用户bash的配置文件,在文件最后新起一行,输入: source ~/soft/edasoft/source.source 保存关闭。 二。安装IUS(或者IFV)(内含ncverilog)工具 需要的工具: Float_Cadence_LicGen.tar IUS09.20.007L1P1.tar.gz 如下图: 安装环境:ubuntu11.10,已经安装了可能需要的一些包(在旋风处可以获取)。1.分别解压两个包,进入IUS09.20.007L1P1,在此目录下打开终端,运行:sudo chmod 777 SETUP.SH 然后再: ./SETUP.SH 就会如下图所示:

点击enter键直到出现: 在后面输入你要安装的目录,如:~/soft/edasoft/IUS 回车继续: 下来惠询问安装路径:

然后会跳出图形界面安装InstallScape: 点击next直到下图,选上所有安装项(除去含64bit字样的,那个是64bit的): 下一步安装:

安装完会提示是否配置,选yes: 选上所有进行配置。在询问是否配置lisence时选否:

之后完毕,close。 2、现在配置lisence。进入刚解压出来的Float_Cadence_LicGen文件夹: 修改all.dat的内容,只修改第二行,注意和你的IUS安装目录对应: 回到Float_Cadence_LicGen文件夹,在该文件夹下打开终端,输入如下指令: wine lmcrypt_cdslmd -i all.dat -o key.cadence -verfmt 6 -r 如下: 执行后会产生key.cadence文件。重命名为cadencelisence.dat,放到你的安装目录下:

Ncverilog 命令使用详解

Ncverilog 命令使用详解 我们知道,由于NC-Verilog使用了Native Compile Code 的技术来加强电路模拟的效率,因此在进行模拟时必须经过compile(ncvlog 命令)以及elaborate(n celab命令)的步骤。编译之后,针对每一个HDL设计单元会产生中间表达。接着elaborate命令会建立整个电路的结构,产生可以用来模拟的资料。最后使用ncsim命令来进行模拟。 三命令模式命令如下: ncvlog -f run.f ncealb tb -access wrc ncsim tb -gui 第一个命令中,run.f是整个的RTL代码的列表,值得注意的是,我们需要把tb 文件放在首位,这样可以避免出现提示timescale的错误。 第二个命令中,access选项是确定读取文件的权限。其中的tb是你的tb文件内的模块名字。 第三个命令中,gui选项是加上图形界面 值得注意的是,在这种模式下仿真,是用“ - ”的。而下边要说的ncverilog是采用“ + ”的。 单命令模式 ncverilog +access+wrc rtl +gui 在这里,各参数与三命令模式相同。注意“ + ”。 在本文里将详细讲述ncverilog 的各种常用的参数,对于三命令模式,请读者自己查看资料。 +cdslib+... 设定你所仿真的库所在 +define+macro ... 预编译宏的设定 +errormax+整数当错误大于设定时退出仿真 +incdir+path 设定include的路径 +linedebug 允许在代码中设定line breakpoint +log+logfile 输出到名为logfile的文件中 +status 显示内存和CPU的使用情况 +work 工作库 +access+w/r/c 读取对象的权限,缺省为无读(-w)无写(-r)无连接(-c) +gui 显示图形交互界面 +input script_file 输入脚本文件 +licqueque 如无licence等待licence +run 如果在GUI交互界面下, 启动后将自动开始仿真 +loadpli1=... 动态加入PLI +timescale 设定仿真单位和精度 +nocopyright 不显示版权信息

ncverilog

ncverilog仿真详解 发表在ASIC/FPGA/汇编, 学习笔记, 编程开发 | 由阿布 | 十一月26, 2011 | 0标签: ncverilog, 仿真 数位IC工具简介——Simulator 工具 ModelSim ModelSim是Mentor公司所推出的软体, 主要用来当作VHDL的模拟器, 也是目前CIC在VHDL方面的主要的模拟软体;但ModelSim不仅支援VHDL的模拟,同样也可用来当Verilog的模拟器, 更进一步的, ModelSim也支援 VHD&Verilog的混合模拟, 这对於单晶片系统(SoC)的发展上, 矽智产(IP)是来源来自不同的地方, 有些矽智产是采用VHDL描述, 有些是Verilog描述, 因此这是不可或缺的功能. 所以CIC引进ModelSim这一套软体. NCSim NC-SIM 为Cadence 公司之VHDL与Verilog混合模拟的模拟器(simulator),可以帮助IC 设计者验证及模拟其所用VHDL与Verilog混合计设的IC功能. NCVerilog NC-Verilog 为Cadence 公司之Verilog 硬体描述语言模拟器(simulator),可以帮助IC 设计者验证及模拟所设计IC 的功能.使用NC-Verilog软体,使用者必须使用Verilog 硬体描述语言的语法来描述所要设计的电路. VCS VCS 为Synopsys 公司之Verilog 硬体描述语言模拟器(simulator),可以帮助IC设计者验证及模拟所设计IC 的功能.使用VCS 软体,使用者必须使用Verilog 硬体描述语言的语法来描述所要设计的电路. ncverilog使用(2009-04-20 16:07:14) ncverilog是shell版的,nclaunch是以图形界面为基础的,二者调用相同内核; ncverilog的执行有三步模式和单步模式,在nclaunch中对应multiple step和single step ncverilog的三步模式为:ncvlog(编译) ncelab(建立snapshot文件) ncsim(对snapshot文件进行仿真) 基于shell的ncverilog操作(尤其是单步模式)更适合于大批量操作 ncverilog的波形查看配套软件是simvision,其中包含原理图、波形、信号流等查看方式 三命令模式: ncvlog -f run.f ncelab tb -access wrc ncsim tb -gui 第一个命令中,run.f是整个的RTL代码的列表,值得注意的是,我们需要把tb文件放在首位,这样可以避免出现提示timescale的错误 注意:ncvlog执行以后将产生一个名为INCA_libs的目录和一个名为worklib的目录 第二个命令中,access选项是确定读取文件的权限。其中的tb是你的tb文件内的模块名字。

Modelsim NC-Verilog仿真理解

Modelsim/NC-Verilog仿真理解 仿真(Simulation),也称为模拟,是对所有集成电路或系统的一种检测方法。用户可以在设计过程中对整个系统和部分模块进行仿真,即在计算机上用仿真软件验证功能是否正确、各部分的时序配合是否正确。如果有问题可以随时进行修改,从而避免逻辑错误。高级的仿真软件还可以整个系统设计性能进行评估。设计规模越大就越需要进行仿真。 仿真包括功能仿真和时序仿真。在设计输入阶段按进行仿真,不考虑信号延时等因素成为功能仿真,又称前仿真;时序仿真又称为后仿真,他在选择了具体器件并完成了布局布线以后进行的含定时关系的仿真。由于不同器件的内部延时不同,不同的布局、布局方案也给延时造成了很大的影响,因此在设计实现后,对网络和逻辑块进行延时仿真,分析定时关系,估计设计性能非常有必要。 要进行电路仿真必须有仿真器的支持。常用的Verilog仿真器有:ModelSim、Verilog-XL、NC-Verilog和VCS等。下面我们简单介绍下我们常用到的ModelSim、NC-Verilog两款仿真软件特点、区别。 一、ModelSim ModelSim是Mentor Graphics子公司ModelSim Technology的产品,是业界优秀的HDL 语言仿真软件之一,它是编译型的VerilogHDL/VHDL混合仿真器。MoselSim可以在同一设计中单独或混合使用Verilog HDL和VHDL,允许Verilog HDL模块调用VHDL的实体,或用VHDL模块调用Verilog HDL的实体。由于ModelSim是编译型仿真器,使用编译后的HDL 库进行仿真,因此在进行仿真前,必须所有待仿真的HDL文件编译成为HDL仿真库,在编译时使源文件获得优化,提高了仿真速度。 Model Sim只完成逻辑功能的仿真,并不考虑具体使用什么器件,学习HDL或者设计逻辑的时候compile一次所用的时间很短,便于调试找出逻辑的错误。所以初学仿真推荐使用Model Sim。 ModelSim可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow 窗口查看某一单元或模块的输入输出的连续变化。 ModelSim提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度

可综合的Verilog语句

可综合Verilog语句 ?一: 综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表. ?二. 设计流程中的综合 ?Verilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。事实上,Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.?正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式. ?使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的. ?这一局限性使设计者不仅需要理解Verilog HDL ,而且必须理解特定综合系统的建模方式, 才能编写出可综合的模型.可综合的数据类型?1.网线数据类型: ?Wire,wor,wand,tri,supply0,supply1 ?2.寄存器数据类型: ?Reg,integer ?Time,real:不能综合. ?3.常量: ?整型. ?实型和字符串型不能综合.可综合的运算符?1.逻辑运算符能直接映射成硬件中的基本逻辑门. ?2.算术运算符 ?3.关系运算符: ?能综合的有:>,<,<=,>=. ?4.相等性算符: ?能够综合的有:==和!=. ?不能综合:===和!==(有些工具按==和!=综合). ?5.移位运算符: ?<<和>>,移位腾出的位都补0. 多个时钟的可综合情况 ?1.多个时钟的情况:对变量的赋值不能受多个时钟控制 例如: ? module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub);

NCVerilog设计秘诀与点评

NCverilog NCVerilog设计秘诀与点评 1. * S) ]8 E. K" x% Z This approach allows completely transparent mixed language, mixed-level, and mixed cycle-event simulations. It also lays the foundation for mixed signal simulations. ' y+ l3 s- ? E, q + C' J9 o+ Y4 C' w c 2.External Interface: (1) VHDL: VHPI,OMI (2) Verilog: PLI, VPI, OMI% F9 z9 W1 G( J( [$ y (Modelsim和VCS也有这个功能) (PLI用的比较多,仿真器一般自带常用的PLI。)8 s: s: o: u' _. a( y3 k( Z$ y (如果需要添加FSDB支持,需要将debussy提供的libpli.dll和libpli.lib 拷贝到tools/lib下面)_/ Z {; m X9 X+ ]; t E7 Y 3. After elaboration, Single executable code stream, Affirma NC Simulator; ) P# J) n. h% [" D 4. Code Coverage ??? 5. Verilog supported: $ e: Y1 k( @: f1 h/ j (1) OVI 2.0; 3 `8 t0 [- N0 i- o (2) IEEE 1364; (3) Verilog-XL implementation; 6. NC-Verilog use: Library.Cell:View 0 [" {/ k" r, Z/ _4 } cds.lib: This file contains statements that define your libraries and that map logical library names to physical directory paths. 7 S f8 ~# `$ n8 L# h4 j% O+ W hdl.var:This file defines which library is the work library. ( c3 i7 y6 e/ Y# T, F* q 7. You can write a setup.loc file to change the directories to search or to change the order of precedence to use when searching for the cds.lib and hdl.var files. & T& R$ o6 ]5 ?1 O+ f, [2 a

Verilog语言良好的代码编写格式

Verilog 及VHDL良好的代码编写风格 良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; (5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用 bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; (11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; (13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals;

NC-verilog 仿真教程和实验实例

Cadence IC设计实验 实验六 NC-Verilog Simulator实验 实验目的:NC_verilog仿真器的使用,包括编译、运行和仿真。 预备工作: cp /eva01/cdsmgr/ training_IC_data/NCVlog_5_0.tarZ . tar -vxfZ NCVlog_5_0.tarZ Lab1。运行一个简单的Verilog设计 [1]、设置设计环境 1.cd NCVlog_5_0/lab1-mux 这个目录包含了用来描述一个多路选择器和其测试平台的verilog 模块。以下是mux_test.v模块内功能模块的端口框图。 建议:如果有时间,你最好看一看各模块(module)的Verilog代码! 2.创建cds.lib文件, vi cds.lib(回车) 按小写”i”切换到编辑模式,在其中写入: Define lab1muxlib ./lab1-mux.lib 有关vi的编辑命令,请参阅相关资料。如”Esc”键切换到命令状态,在命令状态下,”x” 是删除当前字符,”a”是在当前光标后写入,”:wq”是存盘退出,”:!q”是不保存退出。 存盘退出 3.创建(库)文件夹(即目录): mkdir lab1-mux.lib (回车) 4.类似步骤1,创建hdl.var文件,在其中写入: Define WORK lab1muxlib 存盘退出 5.查看verilog源文件。mux.v是2选1多路选择器MUX2_1 的门级建模源文件,mux_test.v

是mux.v的测试台,包含了输入激励信号和监控程序运行的任务语句。 [2]、编译源文件(ncvlog命令): 当前目录应为。。。/你的学号/NCVlog_5_0/lab1-mux。 1.ncvlog mux.v –messages ,这条指令是编译mux.v。 2.vi hdl.var打开hdl.var文件,在其中添加:Define NCVLOGOPTS –messages 存盘退出 注:用NCVLOGOPTS变量定义常用的ncvlog命令行操作,从而避免每次都敲入同样的命令行。 3.编译测试平台源文件: ncvlog mux_test //可以不加后缀.v 4.ncls –all 这一步目的是看一看前面两个ncvlog生成了哪些library objects? 答案是:module lab1muxlib.MUX2_1:module (VST) module lab1muxlib.mux_test:module (VST) 现在你明白lab1muxlib的作用了吗?ncvlog编译后生成的模块放入lab1muxlib工作库中。 [3]、扩展与连接(elaboration详细描述)顶层设计(ncelab命令): 1.ncelab mux_test 2.ncls –all ,查看ncelab生成了哪些library object。 [4]、仿真: ncsim mux_test 观察仿真器的输出情况。你还可以查看ncls.log, ncelab.log, ncsim.log, ncvlog.log文件内容了解更多的信息。 以下Lab2至lab4是编译、扩展与连接(详细描述)和仿真步骤的高级操作。 Lab2。编译的高级技术 一、Lab2-1:寄存器设计 实验目的:学习如何使用hdl.var中的WORK、VIEW、LIB_MAP和VIEW_MAP 变量。 你将学会使用: 1.分别用hdl.var中的WORK变量和用-work选项忽略WORK变量进行编译。 2.分别用hdl.var中的VIEW变量和用-view选项忽略VIEW变量进行编译。 3.用hdl.var中的LIB_MAP和VIEW_MAP变量进行编译。 4.用hdl.var中的LIB_MAP和VIEW_MAP变量进行阐述。 下图是Lab2实验用到的register和counter的端口框图。

Verilog中的一些语法和技巧

1、. 2、. 3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但 是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。 4、在数据类型中?和Z均表示高阻态。 5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定 是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。 6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型 数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0]; 7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。 8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动 地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。 9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是 2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0. 10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变 量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。 11、模块的描述方式:(RTL为寄存器传输级描述) “(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

SDRAM控制器软核的Verilog设计

目前,在很多通信芯片及系统的开发中,常常需要用到存储容量大、读写速度高的存储器。在各种随机存储器件中,SDRAM 的价格低、体积小、速度快、容量大,是比较理想的器件。但是,与SRAM相比较,SDRAM的控制逻辑复杂,使用很不方便。为了解决这个矛盾,需要设计专用的SDRAM控制器,使系统用户象使用SRAM一样方便的使用SDRAM 是十分必要的。考虑到控制器的通用性,本文提出了一种通用的SDRAM控制器的Verilo g设计,并给出了实现结果。 1 SDRAM的工作原理 通常一个SDRAM中包含2个或4个BANK,每个BANK的存储单元是按行和列寻址的。由于这种特殊的存储结构,与SRAM比较而言,SDRAM在工作的原理上有以下几个特点: 第一,SDRAM在上电100us-200us 后,必须由一个初始化过程来配置SDRAM的工作模式。初始化过程是由启动指令流完成:首先由一个Precharge all bank指令完成对所有BANK的预充,然后是两个或多个Auto Refresh指令,最后在模式配置指令下完成SDRAM内部模式设置寄存器的配置。模式寄存器的值控制着SDRAM的工作方式,详细描述如表1所示。 SDRAM模式寄存器: 第二,SDRAM行列地址采用复用的方式减少了地址总线的密度。这样以来,SDRAM 在每次读写操作时,行列地址要锁存。具体的,由ACTIVE命令激活要读写BANK,并锁存行地址,然后在读写指令有效时锁存列地址。 第三,SDRAM的操作是通过AP信号的组合指令字完成的。由于特殊的存储结构,SDRAM操作指令比较多,不像SRAM一样只有简单的读写,其主要的指令字见表2。

verilog中可综合和不可综合语句概述

Verilog 中可综合及不可综合语句概述Verilog 硬件描述语言有很完整的语法结构和系统,类似高级语言,这些语法结构的应用给我们的设计描述带来很多方便。但是,我们知道,Verilog 是描述硬件电路的,它是建立在硬件电路的基础上的。有些语法结构是不能与实际硬件电路对应起来的,也就是说我们在把一个语言描述的程序映射成实际硬件电路中的结构时是不能实现的。下面就是我多年工作经验总结出来的大部分综合工具支持或不支持的verilog 语法结构。 一.用verilog 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial 。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while 等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 ( 12)避免混合使用上升沿和下降沿触发的触发器。 ( 13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 二.不可综合verilog 语句 1 、initial 只能在testbench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial 也可以综合,不知道为什么) 2、events event 在同步test bench 时更有用,不能综合。 3、real 不支持real 数据类型的综合。 4、time 不支持time 数据类型的综合。 5、force 和release 不支持force禾口release的综合。 6、assign 禾口deassign 不支持对reg数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join

verilog相关知识

Verilog-1 1.HDL与C语言的区别 Ans: HDL具有的时序和并行特性是C语言不具备的。 2.High-Z与X(unknow)的区别 Ans: High-Z与unknow的共同点是没有被驱动,导致其电平不可预测。它们 最本质的区别是High-Z总是被tri三态门驱动,当tri控制端使能无效 时,High-Z等效于没有驱动,但在不考虑电容漏电的情况下,其电平 并非不可预测,即High-Z的电平将保持tri控制端使能无效之前的输出 电平值。但实际电容漏电不可忽略,因此被High-Z驱动的信号被认为 是unknow。 3.NCverilog与verilogXL的区别 Ans: VerilogXL是较早的、较经典的编译工具,其结果得到广泛认同,但其 编译的结果并不保留,虽然单次编译速度较快,但多次重复编译时效率 比较低。与其相比,NCverilog是较晚的编译工具,它在编译时会将数 据结构保留,用以加速下一次编译,重复编译时效率较高。 4.影响芯片工作频率的因素有哪些 Ans: a)芯片工作温度,温度越低工作频率越高; b)芯片工作电压,电压越高工作频率越高; c)芯片生产工艺,工艺越先进工作频率越高。 5.Call by name 与Call by order的区别 Ans: Call by name由于需要严格声明被调用模块的端口名,在语法上比起 Call by order显得较为繁琐,但换来了调用端口顺序与被调用模块内部 声明端口顺序无关的好处。依靠这种顺序无关,在使用Call by name的 情况下,更不容易出现由于声明端口顺序导致的错误,同时提高了可读 性,另外在某些情况下增加或删除端口时也更为方便。但值得注意的是, 在调用verilog提供基本元件库时,由于不可能获知基本元件库的端口 名,因此必须使用Call by order。 6.最少使用多少种逻辑门可以实现所有的逻辑运算 Ans: 最少使用nor gate或nand gate 其中之一即可实现所有逻辑运算;根据 de Morgan's Laws可以将逻辑运算and替换or运算(或反之),而inverter 的实现可以通过短路nor gate或nand gate的两个输入端来实现。因此, nor gate或nand gate其中之一即可以实现所有逻辑运算。 7.简述De Morgan's Laws Ans: 在布林代数中,存在以下关系: not(P and Q)=(not P)or(not Q) not(P or Q)=(not P)and(not Q)

相关文档
相关文档 最新文档