VERILOG语言编写规范

VERILOG语言编写规范
VERILOG语言编写规范

VERILOG语言编写规范

1 目的

本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真

结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到

1. 逻辑功能正确

2.可快速仿真

3. 综合结果最优如果是hardware model)

4. 可读性较好。

2 范围

本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。

本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。

3 定义

Verilog HDL : Verilog 硬件描述语言

FSM :有限状态机

伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径

4 引用标准和参考资料

下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本

均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性

Actel HDLCoding Style Guider

Sun Microsystems

Revision

VerilogStyle and Coding Guidelines

5 规范内容

Verilog 编码风格

本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模

块。

命名规范

选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。

1. 用有意义而有效的名字

有效的命名有时并不是要求将功能描述出来如

For ( I = 0; I < 1024; I = I + 1 )

Mem[I]<= #1 32’b0;

For 语句中的循环指针I 就没必要用loop_index作为指针名。

2. 用连贯的缩写

长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下:

Addr address

Pntr pointer

Clk clock

Rst reset

3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂

的引擎信号建议采用高有效

如 nRst, nTrdy, nIrdy nIdsel.

4. 大小写原则

名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写)

如 :Packet_addr, Data_in, Mem_wr , Mem_ce_

Or: PacketAddr, DataIn, MemWr , MemCe

5.全局信号名字中应包含信号来源的一些信息

如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址.

6. 同一信号在不同层次应保持一致性

7. 自己定义的常数类型等用大写标识

如: parameter CYCLE=100.

8.避免使用保留字

如 in out x z等不能够做为变量端口或模块名

9. 添加有意义的后缀使信号名更加明确常用的后缀如下

芯片的双向信号 -xbio

芯片的三态输出 _xz

芯片的漏极开路输出 _xod

芯片原始输出信号 _xo

芯片原始输入信号 _xi

下降沿有效的寄存器 _f

连到三态输出的信号 _z

寄存前的信号 _next

时钟信号 _Clk

Modules

1.顶层模块应只是内部模块间的互连

Verilog设计一般都是层次型的设计,也就是在设计中会出现一个或多个模块,模块间的调用在所难免。可把设计比喻成树,被调用的模块就是树叶,没被调用的模块

就是树根,那么在这个树根模块中,除了内部的互连和模块的调用外,尽量避免再做逻辑,如:不能再出现对reg变量赋值等,这样做的目的是为了更有效的综合,因为在顶层模块中出现中间逻辑,Synopsys 的design compiler 就不能把子模块中的逻辑综合到最优。

2. 每一个模块应在开始处注明文件名功能描述引用模块设计者设计时间及版

权信息等

如 /* =========================== *\

Filename ﹕

Author ﹕whq

Description ﹕File description

Called by ﹕Top module

Revision History ﹕time yy-mm-dd

Revision

Email

Copyright(c)1999,~~~~~~~~~~~~~ ,All right reserved

/* =========================== *\

3. 不要对Inpu t进行驱动, 在module 内不要存在没有驱动的信号,更不能在模块端口中出现没有驱动的输出信号,避免在仿真或综合时产生warning,干扰错误定位

4. 每行应限制在80个字符以内以保持代码的清晰美观和层次感

一条语句占用一行如果较长,超出80个字符则要换行。

5. 电路中调用的 module 名用 Uxx 标示。向量大小表示要清晰,采用基于名字(name_based)的调用而非基于顺序的(order_based)。

Instance U Instance2(

.DataOut (DOUT ),

.DataIn (DIN ),

.Cs_ (Cs_ )

);

6. 用一个时钟的上沿或下沿采样信号,不能一会儿用上沿,一会儿用下沿。如果既要用上沿又要用下沿,则应分成两个模块设计。建议在顶层模块中对Clock做一非门,在层次模块中如果要用时钟下沿就可以用非门产生的PosedgeClk_ ,这样的好处是在整个设计中采用同一种时钟沿触发,有利于综合。基于时钟的综合策略

7. 在模块中增加注释

对信号,参量,引脚,模块,函数及进程等加以说明,便于阅读与维护。

8. Module名要用大写标示,且应与文件名保持一致。

如 Module DFF_ASYNC_RST(

Reset,

Clk,

Data,

Qout

);

严格芯片级模块的划分

只有顶层包括IO引脚(pads),中间层是时钟产生模块, JTAG,芯片的内核(CORE),这样便于对每个模块加以约束仿真,对时钟也可以仔细仿真。

模块输出寄存器化

对所有模块的输出加以寄存( 如图1) 使得输出的驱动强度和输入的延迟可以预测, 从而使得模块的综合过程更简单

- 输出驱动的强度都等于平均的触发器驱动强度

图1

9.将关键路径逻辑和非关键路径逻辑放在不同模块

保证DC可以对关键路径模块实现速度优化, 而对非关键路径模块实施面积优化在。同一模块DC无法实现不同的综合策略,将相关的组合逻辑放在同一模块,有助于DC 对其进行优化因为DC通常不能越过模块的边界来优化逻辑。

Net and Register

1. 一个reg变量只能在一个always语句中赋值

2. 向量有效位顺序的定义一般是从大数到小数

尽管定义有效位的顺序很自由,但如果采用毫无规则的定义势必会给作者和读代码

的人带来困惑,如 Data[-4: 0],则 LSB[0][-1][-2][-3][-4]MSB,或 Data[0:4] 则

LSB[4][3][2][1][0]MSB 这两种情况的定义都不太好,推荐Data[4: 0]这种格式的定

义。

3.对net和register类型的输出要做声明在PORT中。如果一个信号名没做声明Verilog将假定它为一位宽的wire变量。

4. 线网的多种类型。寄存器的类型。

Expressions

1. 用括号来表示执行的优先级

尽管操作符本身有优先顺序,但用括号来表示优先级对读者更清晰,更有意义。

If ((alpha < beta) && (gamma >= delta)).... 比下面的表达更合意

If (alpha < beta && gamma >= delta)...

2. 用一个函数(function)来代替表达式的多次重复

如果代码中发现多次使用一个特殊的表达式,那么就用一个函数来代替,这样在以后的版本升级时更便利,这种概念在做行为级的代码设计时同样使用,经常使用的一组描述可以写到一个任务(task)中。

IF 语句

1. 向量比较时比较的向量要相等

当比较向量时 verilog将对位数小的向量做0 扩展以使它们的长度相匹配它的自动

扩展为隐式的建议采用显示扩展这个规律同样适用于向量同常量的比较

Reg Abc[7:0];

Reg Bca[3:0];

......

If (Abc= = {4’b0, Bca})begin

.......

If (Abc= = 8’b0) begin

2. 每一个If 都应有一个else 和它相对应

在做硬件设计时,常要求条件为真时执行一种动作而条件为假时执行另一动作即使认为条件为假不可能发生,没有else可能会使综合出的逻辑和,RTL级的逻辑不同。如果条件为假时不进行任何操作,则用一条空语句。

always @(Cond)

begin

if (Cond)

DataOut<= DataIn;

End

3. 应注意If ..else if ...else if ...else 的优先级

4. 如果变量在If-else 或case 语句中做非完全赋值则应给变量一个缺省值。即

V1 = 2’b00;

V2 =2’b00;

V3 = 2’b00;

If (a = = b) begin

V1 = 2’b01; case语句通常综合成一级多路复用器(图的右边部分),而if-then-else则综合成优先编码的串接的多个多路复用器,如图的左边部分通常使用case 语句要比if语句快,优先编码器的结构仅在信号的到达有先后时使用。条件赋值语句也能综合成多路复用器,而case 语句仿真要比条件赋值语句快。

2 所有的Case 应该有一个default case允许空语句

Default : ;

Writing functions

1. 在function的最后给function赋值

Function CompareVectors; 函数中避免使用全局变量

否则容易引起HDL行为级仿真和门级仿真的差异。如

function ByteCompare

input [15:0] Vector1

input [15:0] Vector2

input [7:0] Length

begin

if (ByteSel)

Verilog 支持两种赋值过程赋值(procedural) 和连续赋值(continuous。。过程赋值用于过程代码( initial, always, task or function) 中给reg 和 integer 变量tim\realtime

real赋值,而连续赋值一般给wire 变量赋值。

2. Always @(敏感表) 敏感表要完整,如果不完整,将会引起仿真和综合结果不一致

always @(d or Clr)

if (Clr)

q = 1'b0;

else if (e)

q = d;

以上语句在行为级仿真时e的变化将不会使仿真器进入该进程,导致仿真结果错误

3. Assign/deassign 仅用于仿真加速仅对寄存器有用

4. Force/release 仅用于debug 对寄存器和线网均有用

5. 避免使用Disable

6.对任何reg赋值用非阻塞赋值代替阻塞赋值 reg 的非阻塞赋值要加单位延迟但异

步复位可加可不加 =与《=的区别

Always @(posedge Clkor negedge Rst_)

Begin

If (!Rst_) Combinatorial Vs Sequential Logic

1. 如果一个事件持续几个时钟周期,设计时就用时序逻辑代替组合逻辑。

如 Wire Ct_24_e4; Last over several clock cycles Assign Ct_24_e4= (count8bit[7:0]>= 8’h24) & (count8bit[7:0]<= 8’he4);

那么这种设计将综合出两个8 比特的加法器而且会产生毛刺, 对于这样的电路, 要采用时序设计, 代码如下;

Reg Ct_24_e4;

Always @(poseddge Clk or negedge Rst_)

Begin

If (!Rst_)

Ct_24_e4<= 1’b0;

Else if (count8bit[7:0]= = 8’he4)

Ct_24_e4<= #u_dly1’b0;

Else if (count8bit[7:0]= = 8’h23)

Ct_24_e4<= #u_dly1’b1;

Esle;

2. 内部总线不要悬空在default状态要把它上拉或下拉

Wire OE_default;

Assign OE_default= !(oe1| oe2| oe3);

Assign bus[31:0]= oe1 Data1[31:0]:

oe2 Data2[31:0]:

oe3 Data3[31:0]:

oe_default 32’h0000_0000 :

32’hzzzz_zzzz;

为了保持代码的可读性, 常用“`define”做常数声明

2. 把“`define”放在一个独立的文件中参数( parameter) 必须在一个模块中定义, 不要传替参数到模块( 仿真测试向量例外)“`define”可以在任何地方定义, 要把所有的“`define”定义在一个文件中. 在编译原代码时首先要把这个文件读入, 如果希望宏的作用域仅在一个模块中, 就用参数来代替。

对更新的内容更新要做注释

2. 在语法块的结尾做标记

..

End ..

End ..

Endfunction每一个模块都应在模块开始处做模块级的注释,参考前面标准模块头。

4. 在模块端口列表中出现的端口信号都应做简要的功能描述。

VerilogHDL状态机的状态分配。

VerilogHDL描述状态机时必须由parameter分配好状态,这与VHDL不同 VHDL状态机状态可以在综合时分配产生。

2. 组合逻辑和时序逻辑分开用不同的进程

组合逻辑包括状态译码和输出,时序逻辑则是状态寄存器的切换。

3. 必须包括对所有状态都处理,不能出现无法处理的状态,使状态机失控。

4. Mealy机的状态和输入有关,而Moore机的状态转换和输入无关

Mealy 状态机的例子如下:

...

reg CurrentState, NextState, Out1;

Parameter S0=0,S1=1;

always @(posedge Clkor negedge Rst_)

在for-loop中包括不变的表达式浪费运算时间

for (i=0;i<4;i=i+1)

begin

Sig1= Sig2;

DataOut[i]= DataIn[i];

end

for-loop中第一条语句始终不变,浪费运算时间.

2. 资源共享问题

条件算子中不存在资源共享如

z = (cond) (a + b) : (c + d);

必须使用两个加法器;

而等效的条件if-then-else语句则可以资源共享如:

if (Cond)

z = a + b;

else

z = c + d;

只要加法器的输入端复用,就可以实现加法器的共享,使用一个加法器实现3. 由于组合逻辑的位置不同而引起过多的触发器综合如下面两个例子moduleCOUNT (AndBits, Clk, Rst);

Output Andbits;

Input Clk,

Rst;

Reg AndBits;

4. 谨慎使用异步逻辑

module COUNT (Z, Enable, Clk, Rst);

Output [2:0] Z;

Input Rst,

Enable,

Clk;

reg[2:0] Z;

always @(posedge Clk)begin

if (Rst)begin

Z <= #u_dly1'b0;

end

else if (Enable == 1'b1) begin

If (Z == 3'd7) begin

Z <= #u_dly1'b0;

End

else begin

Z <= #u_dlyZ + 1'b1;

end

End

Else ;

End际的运用中要加以避免.

module COUNT (Z, Enable, Clk, Rst);

Output [2:0] Z;

Input Rst,

Enable,

Clk;

Reg [2:0] Z;

对组合逻辑的描述有多种方式,其综合结果是等效的

c = a &b;

等效于

c[3:0] = a[3:0] & b[3:0];

等效于

c[3] = a[3] & b[3];

c[2] = a[2] & b[2];

c[1] = a[1] & b[1];

c[0] = a[0] & b[0];

等效于

for ( i=0; i<=3; i= i+ 1)

c[i]= a[i]& b[i];

可以选择简洁的写法.

6. 考虑综合的执行时间

通常会推荐将模块划分得越小越好,事实上要从实际的设计目标面积和时序要求出发好的时序规划和合适的约束条件要比电路的大小对综合时间的影响要大,要依照设计的目标来划分模块,对该模块综合约束的scripts也可以集中在该特性上,要选择合适的约束条件,过分的约束将导致漫长的综合时间最好在设计阶段就做好时序规划通过综合的约束scripts来满足时序规划。这样就能获得既满足性能的结果,又使得综合时间最省,从代码设计讲 500~5000行的长度是合适的。

7. 避免点到点的例外

所谓点到点例外 Point-to-point exception 就是从一个寄存器的输出到另一个寄存器的输入的路径不能在一个周期内完成多周期路径就是其典型情况,多周期路径比较麻烦在静态时序分析中要标注为例外,这样可能会因为人为因素将其他路径错误地标注为例外,从而对该路径没有分析造成隐患避免使用多周期路径。如果确实要用,应将它放在单独一个模块,并且在代码中加以注释。

8. 避免伪路径(False path)

伪路径是那些静态时序分析(STA)认为是时序失败,而设计者认为是正确的路径。通常会人为忽略这些warning,但如果数量较多时,就可能将其他真正的问题错过了。

9. 避免使用Latch

使用Latch 必须有所记录,可以用All_registers -level_sensitive 来报告设计中用到的Latch。不希望使用Latch时,应该对所有输入情况都对输出赋值,或者将条件赋值语句写全,如在if语句最后加一个else, case语句加defaults。

当你必须使用Latch时,为了提高可测性,需要加入测试逻辑。

不完整的if和case语句导致不必要的latch的产生,下面的语句中, DataOut会被综合成锁存器。如果不希望在电路中使用锁存器,它就是错误。

always @(Cond)

begin

if (Cond)

DataOut<= DataIn

end

10. 避免使用门控时钟

使用门控时钟(Gated clock)不利于移植,可能引起毛刺,带来时序问题,同时对扫描链的形成带来问题。门控钟在低功耗设计中要用到,但通常不要在模块级代码中使用。可以借助于Power compiler来生成,或者在顶层产生。

11. 避免使用内部产生的时钟

在设计中最好使用同步设。如果要使用内部时钟,可以考虑使用多个时钟。因为使用内部时钟的电路要加到扫描链中比较麻烦,降低了可测性,也不利于使用约束条件来综合。

12. 避免使用内部复位信号

模块中所有的寄存器最好同时复。如果要使用内部复位,最好将其相关逻辑放在单独的模块中,这样可以提高可阅读性。

13. 如果确实要使用内部时钟,门控时钟,或内部的复位信号将它们放在顶层将这些信号的产生放在顶层的一个独立模块这样所有的子模块分别使用单一的时钟和复位信号一般情况下内部门控时钟可以用同步置数替代例如:

module COUNT (Reset Enable Clk Qout) module COUNT (Reset Enable Clk Qout)

input Reset Enable Clk input Reset Enable Clk

output [2:0] Qout output [2:0] Qout

reg[2:0] Qout reg[2:0] Qout

wire GATED_Clk= Clk& Enable always @(posedge Clk)begin

if (Reset) begin

always @(posedge GATED_Clkor posedgeReset) Qout= 1'b0

begin end

if (Reset) begin else if (Enable == 1'b1) begin

Qout= 1'b0 if (Qout== 3'd7) begin

end Qout= 1'b0

else begin end

if (Qout== 3'd7) begin else begin

Qout=1'b0 Qout= Qout+ 1'b1

end end

else begin end

Qout= Qout+ 1'b1 end

end endmodule

end

end

endmodule

6 附录

Module 编写示例

/* *\

Filename ﹕

Author ﹕

Description ﹕

Called by ﹕

Revision History ﹕mm/dd/yy

Revision

Email ﹕

Company ﹕ HuaweiTechnology .Inc

Copyright(c)1999, HuaweiTechnology Inc,All right reserved \* */

Module module_name(

Output_ports,.);

Module_name2 Uinstance_name2(...);

lk(Clk), .CLRZ(Clr), .D(Data), .Q(Qout));

.

End

lock(Clock),.Reset(Reset),.Qout(Qout));

initial

begin

Clock = 1'b0;

Reset =1'b1;

#(5*CYC)Reset = 1'b0;

#(5*CYC)Reset = 1'b1;

#(5000*CYC)

$fclose(fout);

$finish;

end

initial

begin

$shm_open("");

$shm_probe("AS");

fout=$fopen("");

end

always #CYCClock = ~ Clock;

//输出数据到文件

always @(posedgeClock)

begin

$fwrite(fout,"%d %b\n",Qout,Qout);

end

endmodule

a 。在testbench 中避免使用绝对的时间, 如#20,#15 或#(CYC+15) 等, 应该在文件前面使用parameter定义一些常量,使得时间的定义象#(CYC+OFF0)的形式,便于修改;

b 。观测结果可以输出到波形文件或数据文件生成波形文件可以用simwave观测结果比较直观而生成数据文件则既可以快速定位也可以通过编写的小程序工具对它进行进一步的处理;

c 。对大的设计的顶层仿真一般不要对所有信号跟踪波形文件会很大仿真时间延长可以有选择的观测一些信号。

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

verilog语言的综合与不可综合

Verilog的综合与不可综合 综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。 一、基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门 4、算术操作符: Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如: Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

Verilog语言的特点

一、第一章 1.几个英文缩写: PLA(Programmable Logic Array)可编程逻辑阵列 FPGA(Field Programmable Gate Array)现场可编程逻辑门阵列 CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件 CAD(Computer Aided Design) 计算机辅助设计 CAE(computer aided engineering) EDA(electronic design automation) 电子设计自动化 2.EDA定义:以计算机为工作平台,以EDA软件为开发环境,以PLD器件或者ASIC专用 集成电路为目标器件设计实现电路系统的一种技术。 3.现代EDA技术的特征【简答】 (1)采用硬件描述语言(HDL)进行设计 HDL语言更适合于描述规模大、功能复杂的数字系统,使设计者在比较抽象的层次上对所设计系统的结构和逻辑功能进行描述。 (2)逻辑综合与优化 目前EDA工具最高只能接受行为级和RTL级描述的HDL文件进行逻辑综合 (3)开放性和标准化 普遍采用标准化和开放性的框架结构,可以与其他的EDA工具一起进行设计工作,实现各种工具的优化组合,集成在一个易于管理的统一环境下,实现资源共享提高工作效率,利于大规模设计。 (4)更完备的库(Library) 在电路设计的各个阶段,EDA系统需要不同层次、不同种类的元器件模型库的支持。EDA 工具要具有更强大的设计能力和更高的设计效率,必须配有丰富的库。各种模型库的功能和规模是衡量EDA工具优劣的一个标志 4.基于EDA技术的设计思路(P4~P5) (1)Top-down设计,即自顶向下的设计 将设计分成几个不同的层次:系统级、功能级、门级、开关级, 按照自上而下的顺序,在不同的层次上对系统进行设计和仿真。 首先从系统设计入手,在顶层进行功能框图的划分和机构设计。 在功能级进行仿真纠错,并用HDL对高层次的系统行为进行描 述,然后用综合工具将设计转化为具体门电路网表。 Top-down的设计须经过“设计—验证—修改设计—再验证”的 过程,不断反复,直到结果能够实现所要求的功能,并在速度、 功耗、价格和可靠性方面实现较为合理的平衡。 (2)Bottom-up设计,即自底向上的设计 设计者选择标准集成电路,或者将各种基本单元做成基本单元库,调用这些基本单元,直到设计出满足需要的系统。缺点:效率低、易出错 5.IP核的一些概念(intellectual property) IP核(IP模块):指功能完整,性能指标可靠,已验证的、可重用的电路功能模块。分为硬核、固核、软核。 (1)软核:如ARM。是指在寄存器级或门级对电路功能用HDL描述,表现为用VHDL 等硬件描述语言描述的功能块,但是并不涉及用什么具体电路元件实现这些功能。 (2)硬核:以版图形式实现的设计模块,基于一定的设计工艺。供设计的最终阶段产品: 掩膜。

VHDL语言的主要描述语句

VHDL语言的主要描述语句 按照语句的执行顺序对VHDL语言进行分类,包含两类语句: 并行描述语句该语句的执行与书写顺序无关,总是同时被执行 顺序描述语句从仿真的角度,该语句是顺序执行的 进程语句(PROCESS)是最典型的并行语句,一个构造体内可以有几个进程语句同时存在,而且并发执行。但是进程内部的所有语句都是顺序语句。 一、顺序描述语句 顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的出现的顺序加以执行的。如下分别介绍有关的顺序描述语句. 1.WAIT语句 进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,当进程执行到等待语句,就被挂起,并等待再次执行进程. 等待语句的格式: *WAIT 无限等待 *WAIT ON 敏感信号变化 *WAIT UNTIL 条件满足 *WAIT FOR 时间到 (1)WAIT ON 格式:WAIT ON 信号[,信号] 例5-1 PROCESS(a,b) BEGIN y<=a AND b;

END PROCESS; 该例中的进程与下例中进程相同: 例5-1 PROCESS BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; 例5-2 PROCESS(a,b) BEGIN y<=a AND b; WAIT ON a,b; END PROCESS; (2)WAIT UNTIL 直到条件满足 格式: WAIT UNTIL 布尔表达式 当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.例: WAIT UNTIL ((x*10)<100) (3)WAIT FOR等到时间到 格式: WAIT FOR 时间表达式 当进程执行到该语句时,被挂起;等待一定的时间后,进程将被启动.例: WAIT FOR 20 ns; WAIT FOR (a*(b+c);

Verilog语言基础教程

Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模

verilog语言编写8位全加器

8位全加器 一、实验目的 用verilog语言编写一个8位全加器,并在modelsim软件上进行仿真。 二、代码 1、源代码: module add8(sum,cout,in1,in2,cin); input [7:0] in1,in2; input cin; output [7:0] sum; output cout; assign {cout,sum}=in1+in2+cin; endmodule 2、激励: `timescale 1ns/100ps module add8_tb; reg[7:0] A,B; reg CIN; wire [7:0] SUM; wire COUT; add8 ul( .sum(SUM), .cout(COUT), .in1(A), .in2(B), .cin(CIN)

); initial begin A=8'd0;B=8'd0;CIN=1'b0; #10 A=8'd20;B=8'd129;CIN=1'b1; #10 A=8'd27;B=8'd19;CIN=1'b0; #10 A=8'd157;B=8'd29;CIN=1'b0; #10 A=8'd37;B=8'd68;CIN=1'b0; #10 A=8'd11;B=8'd69;CIN=1'b0; #10 A=8'd54;B=8'd67;CIN=1'b1; #10 A=8'd211;B=8'd0;CIN=1'b0; #10 A=8'd87;B=8'd43;CIN=1'b1; #10 A=8'd23;B=8'd171;CIN=1'b0; #10 A=8'd12;B=8'd12;CIN=1'b1; #10 A=8'd112;B=8'd115;CIN=1'b0; end endmodule 三、实验过程 1、上机过程 2、仿真波形 3、波形说明 波形图中,从上至下依次为:输入加数A、输入加数B、输入进位CIN、输出进位COUT、输出和SUM。该程序实现的是A+B+CIN=SUM+COUT。 0+0+0=0; 20+129+1=150;

VHDL经典教程(精简快速入门版)

3 VHDL语言 VHDL: VHSIC Hardware Description Language. 3.1 VHDL语言基础 3.2 VHDL基本结构 3.3 VHDL语句 3.4 状态机在VHDL中的实现 3.5 常用电路VHDL程序 3.6 VHDL仿真 3.7 VHDL综合

HDL----Hardware Description Language 一种用于描述数字电路的功能或行为的语言。目的是提为电路设计效率,缩短设计周期,减小设计成本,可在芯片制造前进行有效的仿真和错误检测。 优点: HDL设计的电路能获得非常抽象级的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工艺。 HDL设计的电路,在设计的前期,就可以完成电路的功能级的验证。HDL设计的电路类似于计算机编程。 常用的HDL语言:VHDL 、Verilog HDL

?VHDL 是美国国防部在20世纪80年代初为实现其高速集成电路硬件VHSIC 计划提出的描述语言; ?IEEE 从1986年开始致力于VHDL 标准化工作,融合了其它 ASIC 芯片制造商开发的硬件描述语言的优点,于93年形成了标 准版本(IEEE.std_1164)。 ?1995年,我国国家技术监督局推荐VHDL 做为电子设计自动化硬件描述语言的国家标准。 VHDL 概述: VHDL VHSIC Hardwarter Description Language Very High speed integrated circuit VHSIC

VHDL优点: ?覆盖面广,系统硬件描述能力强,是一个多层次的硬件描述语言; ?VHDL语言具有良好的可读性,既可以被计算机接受,也容易被人们所理解; ?VHDL语言可以与工艺无关编程; ?VHDL语言已做为一种IEEE的工业标准,便于使用、交流和推广。 VHDL语言的不足之处: 设计的最终实现取决于针对目标器件的编程器,工具的不同会导致综合质量不一样。

最新整理Systemverilog语言简介.doc

SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-20 xx Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilo g在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Acceller a开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。下面是一个接口的使用实例:interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus module RAM (chip_bus io, // 使用接口 input clk); // 可以使用io.read_request引用接口中的一个信号 endmodule module CPU(chip_bus io, input clk); ...

VERILOG语言编写规范

VERILOG语言编写规范 1 目的 本规范的目的是提高书写代码的可读性可修改性可重用性,优化代码综合和仿真 结果,指导设计工程师使用VerilogHDL规范代码和优化电路,规范化公司的ASIC设计输入从而做到 1. 逻辑功能正确 2.可快速仿真 3. 综合结果最优如果是hardware model) 4. 可读性较好。 2 范围 本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的编码等。 本规范适用于Verilog model的任何一级( RTL behavioral, gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 3 定义 Verilog HDL : Verilog 硬件描述语言 FSM :有限状态机 伪路径:静态时序分析( STA)认为是时序失败,而设计者认为是正确的路径 4 引用标准和参考资料 下列标准包含的条文通过在本标准中引用而构成本标准的条文在标准出版时所示版本 均为有效所有标准都会被修订使用本标准的各方应探讨使用下列标准最新版本的可能性 Actel HDLCoding Style Guider Sun Microsystems Revision VerilogStyle and Coding Guidelines 5 规范内容 Verilog 编码风格 本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模 块。

命名规范 选择有意义的信号和变量名,对设计是十分重要的。命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。 1. 用有意义而有效的名字 有效的命名有时并不是要求将功能描述出来如 For ( I = 0; I < 1024; I = I + 1 ) Mem[I]<= #1 32’b0; For 语句中的循环指针I 就没必要用loop_index作为指针名。 2. 用连贯的缩写 长的名字对书写和记忆会带来不便,甚至带来错误采用缩写时应注意同一信号在模块中的一致性。缩写的例子如下: Addr address Pntr pointer Clk clock Rst reset 3. 用名字前加小写n表示低电平有效高电平有效的信号不得以下划线表示短暂 的引擎信号建议采用高有效 如 nRst, nTrdy, nIrdy nIdsel. 4. 大小写原则 名字一般首字符大写,其余小写(但parameter, integer 定义的数值名可全部用大写),两个词之间要用下划线连接(或第二个单词首字母大写) 如 :Packet_addr, Data_in, Mem_wr , Mem_ce_ Or: PacketAddr, DataIn, MemWr , MemCe 5.全局信号名字中应包含信号来源的一些信息 如: D_addr[7:2] 这里的 D 指明了地址是解码模块(Decoder module)中的地址. 6. 同一信号在不同层次应保持一致性 7. 自己定义的常数类型等用大写标识 如: parameter CYCLE=100. 8.避免使用保留字 如 in out x z等不能够做为变量端口或模块名

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

Verilog语言介绍

学院姜小波电子信息学院 电子信息

Verilog的历史 什么是HDL Why HDL Why HDL Verilog程序的基本结构 三种建模方式 测试验证

Verilog的历史 什么是HDL Why HDL Why HDL Verilog程序的基本结构 三种建模方式 测试验证

Verilog HDL的历史 ISP (circa 1977) ‐research Simulation, no synthesis ◆project at CMU Simulation but ◆1983年,GDA(Gateway Design Automation)公司发布了verilog硬件描述语言, 即“verilog HDL”,或简称为“verilog”,以及verilog仿真器。 ◆1985年,这门语言及仿真器得到加强改进;仿真器在新的译本中称为 年这门语言及仿真器得到加强改进仿真器在新的译本中称为“Verilog‐XL”。 ◆1987年,Synopsys开始使用Verilog行为语言作为综合产品的输入。 ◆1989年,Cadence公司收购了GDA公司。 年公司 ◆1990年,Cadence公司成立了Open Verilog International(OVI)组织,以控制 Verilog HDL语言的所有权。几乎所有专有集成电路公司支持Verilog语言,并且将Verilog XL作为黄金仿真器。 ‐ ◆1993年,在提交到ASIC公司的所有设计中,有85%的设计使用了Verilog HDL。 ◆1995年,IEEE制定了Verilog HDL的IEEE标准,即Verilog HDL1364‐1995。 到现在,Verilog与VHDL成为最广泛使用的、具有国际标准支持的硬件描 到现在Verilog与VHDL成为最广泛使用的具有国际标准支持的硬件描述语言,绝大多数的芯片生产厂家都支持这两种描述语言;在工业界由于Verilog HDL的一些优点,应用更加广泛。

用verilog语言设计四位简单计算器

module jsq(clk,keyin,keyout,leda,ledb,num3); input clk; input [3:0]keyin; output [3:0]keyout; reg [3:0]keyout; output [3:0]leda; reg [3:0]leda; output [3:0]ledb; reg [3:0]ledb; integer clk_klv; output [31:0]num3; always @(posedge clk) //分频 clk_klv=clk_klv+1; reg [1:0]keyhang=0; //按键扫描 reg [3:0]keynum=0; //最近按键的值

reg keyen=0; //按键锁定作用,每次都必须重新按下才有效 reg keysign=0; //当前按键的属性,0代表数字,1代表+-*/=复位 reg [7:0]delay=0; //按键消抖 reg order2=0; //作用:延迟一个时钟,keyen跳变输出,确保keynum被赋值 always @(posedge clk_klv[10]) begin if(order2==0) begin case({keyhang,keyin}) 6'b00_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h0; order2=1;end end 6'b00_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h1; order2=1;end end 6'b00_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h2; order2=1;end end 6'b00_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h3; order2=1;end end 6'b01_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h4; order2=1;end end 6'b01_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h5; order2=1;end end 6'b01_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h6; order2=1;end end 6'b01_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h7; order2=1;end end 6'b10_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h8; order2=1;end end 6'b10_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h9; order2=1;end end 6'b10_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'ha; order2=1;end end 6'b10_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hb; order2=1;end end 6'b11_1110: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hc; order2=1;end end 6'b11_1101: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hd; order2=1;end end 6'b11_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'he; order2=1;end end 6'b11_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hf; order2=1;end end default: begin keyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen=0;end endcase

Verilog语言介绍

六.Verilog HDL语言介绍 6.1 Verilog HDL基本结构 6.1.1 简单的Verilog HDL 例子 首先来看两个简单的Verilog HDL程序。 【例6.1】一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; //全加 endmodule 【例6.2】一个8位计数器的Verilog HDL源代码 module counter8(out,cout,data,load,cin,clk); output[7:0] out; output cout; input[7:0] data; input load,cin,clk; reg[7:0] out; always @(posedge clk) begin if(load) out=data; else out=out+cin; end assign cout=&out&cin; endmodule 从上面的例子可以看出: ① Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module 和endmodule 两个语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。 ②每个模块首先要进行端口定义,并说明输入(input)和输出(output),然后对模块的功能进行逻辑描述。 ③Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分多行

相关主题
相关文档
最新文档