Verilog编码规范

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Verilog编码规范
Verilog语⾔编码规范
维护⼈:赵⽂哲
E-mail:venturezhao@/doc/cb240dc489eb172ded63b717.html
1.关于verilog语⾔编码规范
本编码规范由西安交通⼤学⼈机所电视组全体学⽣和创芯公司全体员⼯共同编写和维护。

以此来维护DTV系列芯⽚的verilog源码的可读性,健壮性和易维护性。

该⽂档主要致⼒于verilog语⾔的编码标准化,同时也适⽤于其他相似的硬件描述语⾔,如VHDL等。

使代码易于管理的⽅法之⼀是增强代码的⼀致性,让别⼈读懂⾃⼰的代码是⾮常重要的事情。

因此,保持⾃⼰的代码符合统⼀的规范是⼀个编码者的基本素质。

如果⾃⼰的编码风格与本⽂档的规定实在不同,⽆法忍受,请与维护者联系,在组内会议上统⼀讨论解决⽅案。

此外,如其他⼈对该编码规范有任何建议和批评,欢迎联系该规范的维护者。

维护者的联系⽅式详见⾸页的维护列表。

关于本⽂档读者,⽂档主要规范了verilog语⾔的写法和格式,并不介绍verilog语⾔的语法。

请读者⾃⼰学习verilog语⾔的基础知识。

2.项⽬⽂件组织形式
⼀般⽽⾔,项⽬的⽂件需要统⼀的存放在⼀个统⼀的⽂件夹下。

根据各⾃功能不同,分门别类的存放。

以项⽬proj-xx为例,其⽂件存储⽅式如表1所⽰。

表1 项⽬⽂件组织
proj-xx
|--doc
|--datasheet
|--specification
|--inc
|--ip
|--sim_utility
|--altera_utility
|--xilinx_utility
|--dc_utility
|--rtl
|--sim
|--proj_sim
|--subproj_sim
|--adc
|--dac
|--ddr
|--probe
|--dc
|--pt
|--fp
|--pr
|--synplify
doc:存放项⽬相关的⽂档,包括该项⽬⽤到的datasheet,芯⽚规格书(specification)等等。

inc:存放项⽬所⽤到的头⽂件。

主要是整个项⽬所⽤到的整体的定义。

ip:存放商业上购买的成熟IP以及项⽬中⼀些成熟的可复⽤的代码。

⼀般的,ip 分为sim、FPGA以及DC版本。

rtl:存放项⽬的rtl代码。

这是项⽬的核⼼,⽂件名与module名称应当⼀致,同时按照模块的层叠关系进⾏存放,必要时也可以采⽤平⾏结构存放。

sim:存放项⽬的仿真代码。

⼀般在sim中建⽴⼀级⼦项⽬,使得sim⽂件恰恰在项⽬的两级⼦⽬录下。

仿真⽂件的寻址需要上朔两级从根⽬录开始,这样当⽂件
发⽣变动时,⽂件的寻址不需要多么⼤的改动。

softcode:存放芯⽚设置之外,但是仿真平台需要的模块。

仅仅⽤在sim之中。

⼀般存放有仿真⽤adc、dac、⽚外ram等等。

dc:存放synopsys DC综合后的结果。

pt:存放synopsys PT检查的时序报表。

fp:存放后端⼯具floor plan后的⽹表和延时⽂件。

pr:存放后端⼯具place&route后的⽹表和延时⽂件。

synplify:存放synplify⼯具综合后的⽹表。

单单看上⾯的介绍,可能还是⽆法直观的看出我们所编写的代码的存放位置。

图1直观的给出了⽂件的组织形式。

rtl⽂件夹中存放有芯⽚内部的数字逻辑;ip⽂件夹中存放有芯⽚内部的模拟部分和可复⽤部分。

softcode⽂件夹中存放有芯⽚外部的供仿真平台(testbench)使⽤的模块。

⽽testbench⽂件则直接存放在sim⽂件夹之中。

图1 ⽂件组织形式框图
3.verilog⽂件内部组织形式
Verilog⽂件主要有以下⼏个部分组成:开头声明,⽂件引⽤,时间单位定义,module IO声明,宏定义,module IO定
关于这⼏个部分的组织形式,请参考附录⾥的”sample.v”⽂件。

本章节主要介绍除module具体实现之外的其他环节的规定和注意事项。

⽽关于module具体实现部分将根据该module是否可综合,分为之后的两个章节来分别阐述。

1)开头声明
每⼀个verilog⽂件的开头部分,都必须有⼀段声明的⽂字。

该段⽂字如表2所⽰,声明⽂件的版权,作者,修改⽇期以及修改内容介绍等等。

表2 ⽂件的开头声明
// ************************Declaration*************************************** //
// This Verilog file was developed by The Institute of Artificial Intelli- //
// gence and Robotics, Xi'an Jiaotong University. This file contains infor- //
// mation confidential and proprietary to The Institute of Artificial //
// Intelligence and Robotics, Xi'an Jiaotong University. It shall not be //
// reproduced in whole, or in part, or transferred to other documents,or //
// disclosed to third parties, or used for any purpose other than that for //
// which it was obtained, without the prior written consent of The Institute //
// of Artificial Intelligence and Robotics, Xi'an Jiaotong University. This //
// notice must accompany any copy of this file. //
// //
// Copyright (c) 1986--2011 The Institute of Artificial Intelligence and //
// Robotics,Xi'an Jiaotong University. All rights reserved //
// //
// File name: //
// Author: venturezhao //
// Date: 2011-01-01 00:00 //
// Version Number: 1.0 //
// Abstract: //
// //
// Modification history:(including time,version,author and abstract) //
// 2011-01-01 00:00 version 1.0 venturezhao //
// Abstract: Initial //
// //
// *********************************end************************************** //
该段注释可以⽤vim,emacs等⾼级编辑器直接⽣成,见附录的vim配置⽂件。

也可以直接拷贝该段⽂字,再进⾏修改,见附录ultraedit⽂件夹中的”sample.v”。

如果对该⽂件进⾏了修改,请在开头声明中添加以下语句,如表3所⽰。

表3 ⽂件的修改声明
2)module之前的声明
在⽂件的开头声明之后,接下来需要包含(include)本⽂件所需的头⽂件,以及声明本⽂件内的时间单位(timescale)。

如表4所⽰。

表4 module之前的声明
补充:之所以将timescale放在include之后,是因为有时候头⽂件中也会定义时间单位,从⽽造成时间单位混淆的隐含错误。

3)IO⼝定义规范
module的IO⼝定义格式有很多种,本⽂档⽬前规定采⽤verilog-95的格式,在module中声明,在module内部定义的⽅式。

如表5所⽰。

表5 module的IO⼝定义规范
//------------------------------------------------------------------------------ // INDEX: Module
//------------------------------------------------------------------------------ module moudule_name(
// reset & clock
ngreset,
clk,
// input signal
vi_video,
// output signal
vo_video,
// parameter
TYPE
);
//------------------------------------------------------------------------------ // INDEX:2. Interface
//------------------------------------------------------------------------------ // reset & clock
input ngreset;
input clk;
// input signal
input [9:0] vi_video;
4)wire与reg的定义位置
⼀个module中的变量声明可以集中放在⼀起,有时也可以随时使⽤随时定义。

但是对于稍微复杂的模块⽽⾔,随时使⽤随时定义的⽅式将会产⽣前后混淆的问题,同时代码维护时的复杂度也⾼于集中放在⼀起的情况。

因此,本⽂档规定,将reg 与wire的定义放在紧跟着module的IO定义之后。

5)变量定义的对齐⽅式
为了代码的移植⽅便,同时增加可读性。

本⽂档规定采⽤统⼀的空格⽅式。

关键字input,output,inout,reg,wire等应当与0列对齐;总线(bus)的位宽声明应当与7列对齐;IO⼝,变量名称应当与17列对齐。

如果总线位宽过长,导致变量名称⽆法对齐⾄17列,则需要以内容为单位,将局部的⼀些变量统⼀以4为单位后移。

如表6所⽰。

表6 变量定义的对齐标准
6)变量的命名⽅式
变量的命名⽅式有很多种,本规范规定采⽤如下⽅式:变量定义时,根据意义将单词简写成3-8个字符,然后之间⽤下划线连接。

变量的⼤⼩写也有⼀定的规定:对于芯⽚的全局寄存器列表及其相关变量,本规范规定采⽤全部⼤写的形式;对于define或parameter,⼀般采⽤⼤写的形式。

⽽对于其他的变量尽量采⽤⼩写或者⼤⼩写混合的形式。

表7 变量的命名⽅式
7)always模块的对齐格式
在module的具体实现中,begin和end的对齐⽅式有很多种。

本⽂档规定以下两种允许使⽤的格式。

第⼀种格式如表8所⽰,begin跟在判断⾏之后,当碰见end else begin时,正好可以放在⼀⾏。

每⼀次的包含关系时,语句向后递推4列,以形成层叠关系。

第⼆种格式如表9所⽰,begin重新开⼀⾏,end与begin对齐。

这种⽅式在出现end else begin时,会占⽤额外的两⾏。

论⾏数,这与C语⾔的⾏数⼀样,但是纯字母的⽅式毕竟没有⼤括号直观。

其层叠关系与第⼀种⽅式⼀致。

总的来说,这两种格式都可以,但本⽂档还是推荐使⽤第⼀种格式。

除此以外的别的⽅式,如依次空三列等⽅式被禁⽌使⽤。

表8 always模块的⼀种对齐格式
表9 always模块的另⼀种对齐格式
8)空格与tab之争
代码中表⽰层叠关系时,空格和tab是两种常见的实现形式。

其优劣众说纷纭。

有⼈说空格好,因为空格的适⽤范围将⽐较⼴,在各个编辑器下都可以⽆差别的打开。

也有⼈说使⽤tab表⽰层叠关系时,编写代码时将会⽐较⽅便,因为按⼀个tab会⽐按4个空格的速度要快。

本规范规定代码中必须使⽤空格。

⾸先是器适⽤范围较⼴,其次是在vim或者别的⾼级⽂字编辑器下,将tab直接转化成空格的使⽤⽅法⼗分⽅便,根本察觉不
出使⽤空格时的⿇烦。

最重要的是,统⼀使⽤空格会使得代码维护⼯作变得简单和统⼀。

9)⾏内与⾏间限制
⼀⾏的字符不得超过第80列。

这样便于代码的浏览,不需要将⽂件横向滚动,或者因为编辑器⾃动换⾏⽽使得结构凌乱。

换⾏后,可以在当前⾏向后递推4列处开始,也可以按照语义来进⾏对齐。

⼀⾏的末尾不能是空格。

⾸先,这样的空格毫⽆意义;其次,⾏尾的空格对于⽂档编辑时,会造成操作上的不便。

⾏间的空格不可超过2⾏。

过多的空⾏没有任何意义。

表10 ⾏内与⾏间限制
10)注释
对源代码注释时,不得直接翻译语法。

应当指出当前语句的⽬的或者意义。

如表11所⽰,cur_count和cur_cnt分别依次加1。

如果注释仅仅是说明这⼀点,那么这个注释可以直接删掉,这没有任何意义。

正确的做法是,注释中说明该变量的含义,以及加1的⽬的。

另外,错误的注释⽐没有注释更糟糕。

因此,在维护代码时,⾸先考虑更新的,应该是代码的注释。

表11 注释
4.可综合verilog语⾔设计
可综合verilog语⾔由时序逻辑和组合逻辑两部分构成。

verilog语⾔的综合就是对这两种逻辑进⾏匹配嵌套和翻译的过程。

因此,在书写可综合verilog语⾔时,为了得到简单的,可控的硬件实现,⼀般在代码结构上使⽤特定的结构,⽽不会写⼀些较为怪异的结构,使得综合结果变差。

由于编写可综合verilog语⾔的⽬的是将其综合成硬件电路,因此在编写可综合verilog语⾔时,⾸先应想到该代码所代表的硬件电路是什么,只有这样才不会犯⼀些低级错误,⽐如说将两个输出接到⼀个输⼊上,组合逻辑出现了死循环等等。

值得注意的是,verilog语⾔的变量类型,wire和reg,与当前电路是时序逻辑还是组合逻辑没有任何关系,它们仅仅是从verilog 语法上定义的两种类型。

时序逻辑与组合逻辑的实现只取决于verilog代码的结构。

由于时序逻辑和组合逻辑本⾝的特点,其赋值类型也分为了阻塞赋值与⾮阻塞赋值两种。

为综合⽅便,不得在两种逻辑中混⽤这两种赋值。

锁存器是⼀种⽐较省资源的ASIC逻辑,但由于现在的综合⼯具没有很好的办法对其进⾏约束,并且在FPGA下的实现过于复杂。

同时它的出现多数是由于编码者的疏忽⽽产⽣的,因此⼀般情况下不得使⽤锁存器来实现逻辑。

当遇到跨时钟域的情况时,⼀般有双跳技术或者通过异步SRAM等⽅式进⾏隔离。

同时复位也是⼀个⾮常重要的问题。

关于上述话题请查阅相关的资料,下⾯主要介绍可综合verilog语⾔的编码规范。

1)时序逻辑与组合逻辑
同步数字电路有时序逻辑和组合逻辑组成。

在可综合verilog语⾔中,这两种逻辑都有着固定的写法,表12所⽰为时序逻辑的写法;表13所⽰为组合逻辑的⼏种写法。

对于变量的定义⽽⾔,寄存器型的变量是指在always模块中被赋值的变量,如reg、integer、time等等;⽹型的变量是指在assign模块中被赋值的变量,如wire,tri等等。

需要注意的是,这两种类型的变量与verilog的语法有关,⽽与综合后的硬件实现⽆关。

请参考表12和表13的定义。

并不是说综合后是连线的变量在定义时就⼀定是⽹型的,只能说verilog语⾔本⾝还需要发展和完善。

当对综合后的连线有属性说明时,请⼈为的将其赋值到⽹型变量上,以便指明属性。

表12 时序逻辑
表13组合逻辑
2)阻塞赋值与⾮阻塞赋值
verilog语⾔的赋值⽅式有两种,阻塞赋值”=”和⾮阻塞赋值”<=”。

之所以会出现这两种赋值⽅式,是由时序逻辑和组合逻辑的特性所决定的。

由于在组合逻辑中,由于所有的赋值操作都在当前clock内完成,因此我们认为其赋值操作会⽴即⽣效。

阻塞赋值的含义正好与其吻合。

在时序逻辑中,由于所有的赋值操作都在下⼀个clock内⽣效,因此我们认为其赋值操作在当前时刻不能⽣效。

这与⾮阻塞赋值的含义相同。

有鉴于此,任何在组合逻辑中使⽤⾮阻塞赋值,或者在时序逻辑中使⽤阻塞赋值的写法都是有悖于硬件实现的。

在可综合verilog语⾔中,这种混⽤⽅式是被禁⽌的。

3)同步跨时钟域的信号
在verilog具体实现的最开始,应当⾸先处理需要通过双跳⽅式同步的信号。

将这些信号进⾏两级flip-flop延时。

注意内部的⼤⼩写关系和命名⽅法,具体的请参见表14。

表14同步跨时钟域信号
补充:对于可以⽤双跳⽅式同步的信号,⼀般⽽⾔是变化⽐较缓慢的单根信号。

或者⼏乎不变的⼀组信号。

对于递增或递减的信号,应当采取格雷码编码的⽅式。

4)有限状态机(FSM)的写法
有限状态机的实现有⼏种经典的写法,这⾥我们推荐下⾯这⼀种⽅式,如表15所⽰。

表15 FSM的书写格式
// FSM
always @(posedge clk ornegedge ngreset) begin
if (!ngreset) begin
cur_state <= INIT;
endelsebegin
cur_state <= next_state;
end
end
always @(*) begin
case(cur_state)
next_state =START;
end
START: begin
next_state =INIT;
end
default:
next_state =INIT;
endcase
end
always @(*) begin
case(cur_state)
INIT: begin
sig_out =1'b0;
end
START: begin
sig_out =1'b1;
end
default:
sig_out =1'b0;
endcase
end
这种写法清晰地将组合逻辑与时序逻辑分开,可以⽅便的识别出代码所对应的硬件逻辑。

当书写熟练之后,也可以将
next_state⽣成与cur_state延时写在⼀起,但应当清楚写在⼀起后的代码可以清晰的拆成当前的这种形式。

补充:在处理较为复杂的电路逻辑时,⼀般都是以组合逻辑,即⼀个clock内的逻辑,作为思考的出发点。

因此组合逻辑才是电路逻辑的根本。

思考问题的时候应当以组合逻辑的⽅式来进⾏思考,当需要延时到下⼀个clock时,才会出现时序逻辑。

我们在分析带有条件判断的时序逻辑时,⼀定要明确这其实是⼀个组合逻辑和⼀个时序逻辑的简写形式。

5)锁存器与循环逻辑
verilog语⾔中,如果判断语句的分⽀没有补全,则verilog语法规定,将其默认补全为赋值为当前值。

对于时序逻辑⽽⾔,这只是将flip-flop的输出送给了输⼊处得组合逻辑⽽已,没有任何问题。

⽽对于组合逻辑⽽⾔,为了实现赋值为当前值,由于组合逻辑本⾝没有存储单元,⼀般会综合成⼀个锁存器(latch),以保持当前值。

对于latch⽽⾔,由于没有合适的综合⼯具,设计时⼀般不会被采⽤。

这就要求在书写代码时,必须对组合逻辑的判断分⽀进⾏补全,且不得出现将变量⾃⾝赋给⾃⾝的情况。

在组合逻辑中将变量⾃⾝赋给⾃⾝,称之为循环逻辑。

在同⼀段always块或者assign语句中,这种逻辑容易被发现。

⽽如果在多个块中,也出现了多级的循环赋值时,该逻辑也会出现问题。

需要重新分析电路,并重新设计。

表16锁存器的出现与循环逻辑
// 出现Latch的隐含形式
always @(*) begin
if(condition) begin
end//[error]条件没有补全,会产⽣Latch
end
// 出现Latch的显式形式
always @(*) begin
if(condition) begin
latch_i =2'h0;
end else begin
latch_i =latch_i;//[error]⾃⾝赋给了⾃⾝,会产⽣Latch
end
end
// 循环逻辑
always @(*) begin
circum_var = var01;//[error]在组合逻辑中循环赋值
end
assign var01 = var02;
assign var02 = circum_var;
补充:使⽤verilog-95的语法时,当always模块为组合逻辑时,当敏感变量不全,会发⽣什么情况?有⼀种说法是,会产⽣锁存器。

这种说法是不确切的,不信请尝试⼀下在不⽤异步flip-flop的条件下,只⽤锁存器来实现其硬件电路。

正确的解释是:这将会造成仿真与综合不⼀致。

在综合时,综合器并不考虑敏感变量列表,会将其直接综合成组合逻辑。

⽽仿真平台会根据敏感变量列表来进⾏判断是否执⾏该段语句。

这样会造成仿真与综合的失配。

6)关键路径优化
为了尽可能快的提⾼verilog综合后的⼯作频率,需要对代码中,组合逻辑最长的逻辑进⾏优化。

最根本的优化⽅法是优化电路的逻辑设计。

除此以外,规范书写的格式也可以提⾼部分效率。

例如,改变条件判断的次序,尽量将时间最长的判断分⽀放在最外层。

将条件判断的分⽀时间尽量平衡,也可以提⾼⼀部分的效率。

如表17所⽰。

表17优化条件分⽀判断
7)三态门与双向IO
在数字电路的内部,⼀般不适⽤三态门,和双向IO。

如果内部出现了三态门的⾼阻态时,其悬浮的电路将会消耗较⾼的功率。

⽽inout接⼝在ASIC时⼀般会有专门的双向IO PAD来实现,最好将其保持成sig_i,sig_o,sig_e的形式,直到芯⽚的PAD 处。

如表18所⽰。

表18 双向IO
8)数组的使⽤与for循环
在可综合verilog语⾔中使⽤数组,⼀般的⽬的是对相同属性的⼀组变量进⾏简写。

其操作⼀般与for循环共同使⽤。

for循环在可综合的verilog语⾔中,其⽬的也是对⼀组相同的操作进⾏简写。

因此,它的循环次数必须是在综合前就已经确定的。

可以将它展开成确定的语句来直观的理解。

9)synopsys综合原语
由于综合器要对代码进⾏优化。

为了优化过程可以按照我们的要希望来进⾏,在使⽤synopsys兼容的综合⼯具时,如
DC,synplify,Quartus等,需要使⽤synopsys 综合原语。

常⽤的综合原语有:
/* synthesis noprune*/:防⽌reg或module在综合后因优化⽽删掉。

/*synthesis preserve*/:防⽌reg或module在综合后被优化成常数。

/*synthesis keep*/:防⽌wire在综合后因优化⽽删掉。

//synthesis full_case:声明case语句已经列完了所有情况,其他情况下保持原值。

在case处在组合逻辑中时,有可能导致综合出锁存器。

//synthesis parallel_case:声明case语句的条件是互不相容的。

//synthesis translate_on: 声明在此之下的代码必须被综合,与translate off配对使⽤。

//synthesis translate_off: 声明在此之下的代码不被综合,与translate on 配对使⽤。

值得注意的是,这些语句⼀般是在调试时使⽤。

不够清晰的使⽤这些指令会导致仿真与综合的失配。

需要谨慎使⽤。

表19 synopsys综合原语
//------------------------------------------------------------------------------ // INDEX: Module
//------------------------------------------------------------------------------ module moudule_name(
// reset & clock
ngreset,
clk,
// input signal
vi_video,
// output signal
vo_video,
// parameter
TYPE
)/*synthesis noproune*/;//保持module不被优化
//------------------------------------------------------------------------------ // INDEX:2. Interface
5.仿真⽤Verilog语⾔设计
对于硬件描述语⾔⽽⾔,仿真环境的搭建是⾮常重要的⼀步。

⼀般⽽⾔,在正式编码之前,应当⾸先建⽴该平台的仿真环境。

⼀个完善的仿真环境对于可综合verilog代码编写和调试都有莫⼤的帮助。

verilog语⾔最初就是为了搭建仿真环境⽽设计的。

它除了⽬前⽤于描述实际硬件电路以外,还可以⽤于它的最初的⼯作,HDL 仿真环境的搭建。

⽤于仿真的verilog语⾔可以使⽤⼀些与硬件⽆关的函数或资源,不需要考虑实际的硬件限制,从⽽可以模拟芯⽚的外围⼯作环境,并实现整体的仿真环境。

此外,对于verilog的仿真环境,还需要熟悉特定软件的配置。

以nc-verilog为例,需要熟悉它的命令⾏⼯作模式。

下⾯介绍仿真⽤verilog的规范。

1)task与function
task与function是仿真⽤verilog中增加的功能。

task可以描述⼀段与时序相关的操作;⽽function只能描述与时序⽆关的操作。

⼀般的,使⽤function来书写⼀些可以复⽤的组合逻辑。

使⽤task来书写⼀段与时序相关的操作逻辑。

2)⽂件的读写操作
在仿真⽤verilog语⾔中,经常涉及到对⽂件的读写操作。

其格式如表20所⽰。

表20⽂件操作
3)dump波形的函数
在调试verilog代码时,经常需要查看verilog代码中的中间变量的变化情况,这就需要将波形导出,也就是常说的dump波形。

导出波形的格式有很多种,在此以verdi(Debussy)为例,如表21所⽰。

表20 dump波形
4)testbench的写法
testbench⽂件作为⼀个仿真环境的顶层⽂件,需要在内部包含时钟,复位以及该平台的输⼊输出⽅式等模块。

以表21为例,具体的例⼦请见附录”tb_sample.v”。

表21 testbench⽂件
// generate reset and clock
initialbegin
ngreset =1'b0;
clk =1'b0;
#20;
ngreset = 1'b1;
#50_000_000;
$finish;
end
// clk = 148.5M Hz
always #3.37 clk = ~clk;
// read file
initialbegin
$readmemh("FILE_PATH/FILE_NAME.EXTERN",vi_video);
end
// sample instance
sample sample_cmpnt(
// reset & clock
.ngreset(ngreset),
.clk(clk),
// input signal
.vi_video(vi_video),
// output signal
.vo_video(vo_video),
// parameter
.TYPE(8'h0)
);
5)基于终端的仿真⽂件
在终端下执⾏⼀个⼯程的仿真是⾮常快捷的。

⼀般也推荐使⽤这种⽅式来仿真verilog平台。

常⽤的仿真平台有modelsim,nc-verilog,vcs等等。

下⾯以nc-verilog 为例,来说明仿真⽂件的写法。

⾸先是⼀个批处理⽂件,nc-verilog只需执⾏如表22所⽰的命令即可。

在windows 下将其定义成批处理⽂件即可,在linux下直接执⾏该⽂件即可。

其次需要⼀个包含的配置⽂件,这⾥⾯可以包含include路径、define参数,综合的⽂件等等信息。

如表23所⽰。

表22ncverilog仿真命令
表23ncverilog配置⽂件
// parameter
+ncloadpli1=debpli:deb_PLIPtr
+access+rwc
//+neg_tchk
// ========================================= //----code----//
// ========================================= // ========================================= // testbench
// ========================================= ./tb_sample.v
// ========================================= // rtl
// ========================================= ../../rtl/dtv110a/dptv_core/dpu/post.v。

相关文档
最新文档