veriloghdl学习心得.docx
- 文档编号:5627148
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:13
- 大小:35.38KB
veriloghdl学习心得.docx
《veriloghdl学习心得.docx》由会员分享,可在线阅读,更多相关《veriloghdl学习心得.docx(13页珍藏版)》请在冰豆网上搜索。
veriloghdl学习心得
竭诚为您提供优质文档/双击可除
veriloghdl学习心得
篇一:
Verilog学习心得
Verilog学习心得因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module.比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register,如果是,它的clock是什么?
D端是什么?
Q端是什么?
有没有清零和置位?
同步还是异步?
再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。
同样,Verilog中没有“编译”的概念,而只有综合的概念。
写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。
曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:
就是用verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好的电路来的.
一般写verilogcode时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。
可以看着图直接写code。
要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的m
odule外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作.这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的.因为它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的.
要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是c,很多写法是不可实现的.要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现.只要满足它的语法,实现你要的功能就行了.
有网友说关于#10clk=~clk的问题,虽然这种语句是不可综合的,但是在做simulation和verification是常常用它在testbench中来产生一个clock信号。
再比如常常用到的大容量memory,一般是不会在片上实现的,这个时候也需要一个unsynthesizablemodule.mengxy所言切中肯罄。
我们设计的module的目的是为了可以综合出功能正确,符合标准的电路来。
我想这是个反复的过程,就像我们在写designflow中总要注明前仿真,综合后的仿真,以及后仿真等。
仿真是用来验证我们的设计的非常重要的手段。
而verilog里那些看是无聊的语句这个时候就会
发挥很大的作用。
我想,用过verilog_xl的兄弟应该深有体会。
verilog_xl里的操作,可以用verilog里的系统命令来完成。
通过最近的应聘我也深有体会,很多公司看中你在写code时,是否考虑到timing,
architecture,DFT等,这也说明verilog中的任何语句都非常重要的。
要写代码前必须对具体的硬件有一个比较清晰的概念但是想一次完成可综合代码就太夸张了,verilog的自顶向下设计方法就是从行为建模开始的,功能验证了以后再转向可综合模型.太在意与可综合令初期设计变得太累
很同意这种看法,在做逻辑结构设计时,综合的因素是要考虑的,但是有很多东西不能考虑的过于细致,就是在设计的时候不能过于紧卡时延,面积等因素,因为这样以来综合后优化的余量就会很小,反而不利与设计的优化,如果在时延和面积要求不是很紧张的情况下,其实代码写的行为级,利用综合工具进行优化也是一种方法。
偶就听说有一家很有名的公司,非常相信综合工具的优化能力,从来不作综合后仿真的,hehe.当然,如果面积和时延的要求很高,最好还是把代码写的底层一点,调用库单元时,也要充分考虑其面积和时延的因素。
Verilog与c++的类比
1.Verilog中的module对应c++中的class。
它们都可以实例化。
例如可以写一个FullAddermodule,表示全加器这种器件。
moduleFullAdder(a,b,cin,sum,cout);
inputa,b,cin;
outputsum,cout;
assign{cout,sum}=a+b+cin;
endmodule
然后在执行8-bit补码加减运算的ALumodule中实例化8个FullAdder,表示ALu用到了8个FullAdder。
moduleALu(a,b,result,cout,is_add);
input[7:
0]a,b;
inputis_add;
output[7:
0]result;
outputcout;
wire[7:
0]b_not=~b;
wire[7:
0]b_in=is_add?
b:
b_not;
wire[7:
0]carry;
assigncarry[0]=is_add?
1b0:
1b1;
//module实例化
//8-bitrippleadder
FullAdderfa0(a[0],b_in[0],carry[0],result[0],carry[1]);FullAdderfa1(a[1],b_in[1],carry[1],result[1],carry[2]);FullAdderfa2(a[2],b_in[2],carry[2],result[2],carry[3]);FullAdderfa3(a[3],b_in[3],carry[3],result[3],carry[4]);FullAdderfa4(a[4],b_in[4],carry[4],result[4],carry[5]);FullAdderfa5(a[5],b_in[5],carry[5],result[5],carry[6]);FullAdderfa6(a[6],b_in[6],carry[6],result[6],carry[7]);FullAdderfa7(a[7],b_in[7],carry[7],result[7],cout);
endmodule
对应在c++中先写FullAdderclass,然后在ALuclass中以FullAdder作为datamember。
classFullAdder
{
};
classALu
{
FullAdderfa[8];
};
另外一点,moudle声明port的方式,像是从早期c语言的函数定义中学来的:
char*strcpy(dst,src)
char*dst;
char*src;
{
//...
}
2.Verilog中的模块调用时,指定端口可以使用名称绑定。
c++在调用函数时,参数只能按顺序书写。
例如memset()的原型是:
void*memset(void*s,intc,size_tn);
如果你想将某个buf清零,应该这么写:
charbuf[256];
memset(buf,0,sizeof(buf));
但是如果你不小心写成了:
memset(buf,sizeof(buf),0);
编译器不会报错,但运行的实际效果是根本没有对buf清零。
(记得Richardstevens的书里提到过这一点。
)
在Verilog中,如果要写一个测试ALu的module,那么其中对ALu实例化的指令可以这么写:
modulealu_test;
reg[8:
0]a_in,b_in;
regop_in;
篇二:
verilog语法学习心得
verilog语法学习心得
1.数字电路基础知识:
布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计
2.数字系统的构成:
传感器AD数字处理器DA执行部件
3.程序通在硬件上的执行过程:
c语言(经过编译)-->该处理器的机器语言(放入存储器)-->按时钟的节拍,逐条取出指令、分析指令、执行指令
4.Dsp处理是个广泛概念,统指在数字系统中做的变换(DFT)、滤波、编码解码、加密解密、压缩解压等处理
5.数字处理器包括两部分:
高速数据通道接口逻辑、高速算法电路逻辑
6.当前,Ic产业包括Ic制造和Ic设计两部分,Ic设计技术发展速度高于Ic设计
7.FpgA设计的前续课程:
数值分析、Dsp、c语言、算法与数据结构、数字电路、hDL语言计算机微体系结构
8.数字处理器处理性能的提高:
软件算法的优化、微体系结构的优化
9.数字系统的实现方式:
编写c程序,然后用编译工具得到通用微处理器的机器指令代码,在通用微处理器上运行(如
8051/ARm/penTuIm)
专用Dsp硬件处理器
用FpgA硬件逻辑实现算法,但性能不如AsIc
用AsIc实现,经费充足、大批量的情况下使用,因为投片成本高、周期长
10.FpgA设计方法:
Ip核重用、并行设计、层次化模块化设计、top-down思想
FpgA设计分工:
前端逻辑设计、后端电路实现、仿真验证
11.matlab的应用:
matlab中有许多现成的数学函数可以利用,节省了复杂函数的编写时间
matlab可以与c程序接口
做算法仿真和验证时能很快生成有用的数据文件和表格
Dspbuilder可以直接将simulink模型转换成hDL代码,跳过了中间的c语言改写步骤
12.常规从算法到硬件电路的开发过程:
算法的开发
c语言的功能描述
并行结构的c语言改写
verilog的改写
仿真、验证、修正
综合、布局布线、投入实用
13.c语言改写成verilog代码的困难点:
并行c语言的改写,因为c本身是顺序执行,而不是并行执行
不使用c语言中的复杂数据结构,如指针
目前有将c语言转换成verilog的工具?
14.hDL
hDL描述方法是从电路图描述方法演化来的,相比来说更容易修改
符合Ieee标准的有veriloghDL和VhDL
VhDL由美国国防部开发,有1987和1993两个版本
verilog由cadence持有,有1995、20XX、20XX三个版本
verilog较VhDL更有前景:
具有模拟电路描述能力、不仅可以开发电路还可以验证电路、门级以下描述比VhDL强
RTL级和门级的综合已经成熟,主要是注意行为级的综合结果,使用可综合的编程风格
sYsTemVeRILog是VeRILog的一种延伸
15.Ip核的应用:
软核softcore:
功能经过验证的、可综合的、实现后门数在5K以上的hDL代码
固核firmcore:
功能经过验证的、可综合的、实现后门数在5K以上的电路结构编码文件,如edif,不可更改
硬核hardcore:
功能经过验证的、可综合的、实现后门数在5K以上的电路结构版图,已带工艺参数,不可更改
16.hDL语言综合后得到eDIF,这是一种标准电路网表
eDIF经过具体工艺库匹配、布局布线、延时计算后得到网表
eDIF不可更改,作为固核存在
17.verilog特点:
区分大小写,所有关键字都要求小写
不是强类型语言,不同类型数据之间可以赋值和运算
//是单行注释可以跨行注释
描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原则
门级描述使用门级模型或者用户自定义模型uDp来代替具体基本元件,在IDe中针对不同FpgA器件已经有对应的基本元件原语
18.verlog语法要点:
moduleendmodule之间由两部分构成:
接口描述和逻辑功能描述
Io端口种类:
inputoutputinout
相同位宽的输入输出信号可以一起声明,input[3:
0]a,b;不同位宽的必须分开写
内部信号为reg类型,内部信号信号的状态:
01xz,3bx1=3bxx1x/z会往左扩展3b1=3b001数字不往左扩展
逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能
always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行
常量格式:
:
默认进制为10进制
默认位宽为32位
位宽是从二进制宽度角度而言的
由位宽决定从低位截取二进制数2hFF=2b11,通常由被赋值的reg变量位宽决定
parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义
变量种类:
wireregmemory
Io信号默认为wire类型,除非指定为reg类型
wire可以用作任何输入输出端口
wire包括inputoutputinout
wire不带寄存功能
assign赋值语句中,被赋值的信号都是wire类型
assign之所以称为连续赋值,是因为不断检测表达式的变化
reg类型可以被赋值后再使用,而不是向wire一样只能输出,类似VhDL中的buffer端口
reg类型变量初始值为x(VhDL中初始值为本类型最小值,通常是0)
always模块里被赋值的信号都必须定义为reg类型,因为always可以反复执行,而reg表示信号的寄存,可以保留上次执行的值
reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数
verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来了
memory型只有一维数组,由reg型变量组成
memory初始化只能按地址赋值,不能一次性赋值
1*256的memory写法:
regmema[255:
0]mema[3]=0;
不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取
A[a:
b]无论ab谁大,a总是实际电路的信号高位,b总是实际电路的信号低位
算术运算中如果有x值则结果为x
for循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在
==和!
=只比较0、1,遇到z或x时结果都为x(x在if中算做假条件),结果可能是1、0、x
===和!
==比较更加苛刻,包括x和z的精确比较,结果可能是0、1
b1或1b0两种,Ah100000000,所以拼接运算中各信号一定要指定位宽
移位运算左移将保留4b1000 数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算
非阻塞式赋值 阻塞:
在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞
非阻塞:
在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞
块结束后才能完成赋值
块内所有 用于描述可综合的时序电路
=:
=语句结束之后过程always才可能结束
在always过程中,beginend块内按先后顺序立即赋值,在forkjoin内同时赋值(可能造成冲突)与assign连用描述组合电路
beginend中阻塞的含义:
begin...@(A)b=c...;end如果A事件不发生则永远不能执行下去,被阻塞了
由于时钟的延时(往往在ps级),多个always(posedge)之间究竟谁先执行是个未知数
使用原则:
同一个always过程块内建立时序电路用 纯组合逻辑电路用=,生成的电路结构最简单,执行速度最快
同一个always块内不要混用 不要在多个always块内对同一个变量赋值(多源驱动)
ifelse的三种形式,第三种形式适合描述优先编码器
if条件中0/x/z当成假,1当成真,非0的数值也当成真
case语句的三种:
case(四种状态的比较)casez(忽略z)casex(忽略x和z,只看哪些位的信号有用)case语句中所有表达式值的位宽必须相等,default中不能将nbx用bx代替
避免生成锁存器的方法:
电平触发时if后加elsecase中加default?
使用casex会将不必要的状态视为无关项,使得综合出来的电路最简单
两种特殊的括号:
begin顺序语句...endfork并行语句...join,其差别在于块内语句的起止时间、执行顺序、相对延时
块被命名后,其内部变量可以被调用,因为变量都是静态的(调用信号:
对应电路中的一个信号线被引到另一处)
initial块只无条件执行一次always块在满足条件时不断执行
initial常用来写测试文件,always块常用来写电路描述
always既可以描述组合逻辑电路又可以描述时序逻辑电路
always如果后面有敏感信号列表则不能用wait语句
always既可以描述电平触发又可以描述边沿触发,wait只能描述电平触发
assign常用于描述组合逻辑电路
测试文件中一般都是现initial后always
生成语句:
生成快的本质是使用循环内的一条语句代替多条重复的verilog语句,简化了用户的编程genvar用于声明生成变量,生成变量只能用在生成快之间
仿真时,仿真器会将生成块中的代码展平,在确立后的方针代码中,生成变量是不存在的最好是先想象出来循环生成语句被展平后的电路样子,再写相关的描述语句
task和function的区别:
task可以定义自己的仿真时间单位,function与主模块共用同一个仿真时间单位
函数不能启动任务,任务能够启动函数
函数至少要有一个输入变量,任务没有输入变量
函数返回一个值,任务不返回值
一个模块的设计包括3个部分:
电路模块的设计测试模块的设计设计文档的编写
设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,得到时序分析报告
从时序分析报告中可以知道电路的实际延迟t,同步电路内每个时钟周期要大于t,从而可确定该运算逻辑的最高频率
综合器之所以能够实现加法器、乘法器是因为库中已经存在可配置的参数化器件模型
FpgA内总线宽度容易自定义,以便实现高速数据流,三态数据总线相当于数据流的控制阀门
数字系统内数据流的控制:
开关(或三态数据总线)、数据暂存部件(寄存器)、同步状态机控制(整个系统在一个时钟域内)
流水线操作pipeline:
K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入
流水线操作获得第一个结果的时间要比不用流水线操作的时间长,但以后结果获得时间都只需要一个时钟周期,提高了数据吞吐量
流水线操作的保证:
Tclk>K*(组合逻辑延迟+触发器的建立保持时间/触发时间),即时间片段要长于最大路径延迟
体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主
本质上是一种同步逻辑
同步时序逻辑和异步时序逻辑:
同步时序逻辑指所有寄存器组由唯一时钟触发always@(posedgeclk)或always@(negedageclk)
异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发always@(posedgeclkorposedagereset)目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠
严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中clk要单独用线,而不要经过反相器等部件
always@(posedge..)begin... 不同速率数据接口的处理方法(异步数据的处理方法):
帧同步FIFo双端口RAm
同步状态机:
包括moore和mealy型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量)状态机的开发步骤:
根据实际问题列出输入输出变量和状态数
画出状态图并化简
写出状态转移真值表得到逻辑表达式
用D触发器或JK触发器构建电路(目前用D触发器多)
verilog描述时只需要得到简化的状态图就可以描述
状态编码方式:
独热码格雷码
状态机主体程序有单always描述方式和多always描述方式
采用case/casez/casex建立模型最好,因为x是无关态,生成的电路最简单
default:
state=bx与实际情况更一致,效果等同于default:
state 只有同步状态机才能被目前的综合
for语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和case语句说明所有情况有优先级的ifelse结构会消耗更多资源,建议用无优先级的case替代
模块的复用往往比代码上修改节省的资源多
pLL的分频、倍频、移相操作会增加设计精度
同步时序电路的延时:
#x通常用于仿真测试,实际硬件延时是:
长延迟用计数器,小延迟用D触发器,此方法用来取代延迟链
同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间
reg类型在always中不一定综合成时序电路,也可能是组合逻辑电路
乒乓操作与作用异步时钟域同步问题
延迟包括门延迟和线延迟
组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下
增减敏感信号得到的结果一样
补充部分:
veriloghDL起初是作为写testbench而产生的
verilog有1995进入Ieee标准,为Ieee-1364,于20XX年进行了扩展,为Ieee1364-20XX;
verilogAms可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;
verilog的标识符区分大小写,关键字使用小写;
用\\来进行单行注释,用\**\来进行跨行注释;
篇三:
FpgA,学习心得体会
篇一:
fpga学习心得大报告
《fpga技术基础》学习报告
--课程内容学习心得
姓名:
学号:
年级专业:
指导教师:
瞿麟20XX10401128自动化101薛小军摘要从开始学fpga到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了,fpga学习总结。
但是不管现在的水平如何,现在就总结一下自己学习它的感受或一些认识吧。
关键词
fpgade2板quartusii软件verilog语言
引言
fpga是什么?
fpga现状?
怎样学习fpga?
fpga是现场可编程门阵列的简称,fpga的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- veriloghdl 学习心得
![提示](https://static.bdocx.com/images/bang_tan.gif)