最新Verilog关键字整理资料Word文件下载.docx
- 文档编号:22267815
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:45
- 大小:77.37KB
最新Verilog关键字整理资料Word文件下载.docx
《最新Verilog关键字整理资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《最新Verilog关键字整理资料Word文件下载.docx(45页珍藏版)》请在冰豆网上搜索。
默认位宽为32位
位宽是从二进制宽度角度而言的
由位宽决定从低位截取二进制数2'
hFF=2'
b11,通常由被赋值的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
&
的结果只有1'
b1或1'
b0两种,A&
A的结果位宽则是与A相同的
{1,0}为64'
h100000000,所以拼接运算中各信号一定要指定位宽
移位运算左移将保留4'
b1000<
1等于5'
b10000,右移则舍弃4'
b0011等于4'
b0001
数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算
非阻塞式赋值<
=与阻塞式赋值=
阻塞:
在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞
非阻塞:
在同一个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中不能将n'
bx用'
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...<
=...end表示同步时序逻辑(同时刻赋值)
不同速率数据接口的处理方法(异步数据的处理方法):
帧同步FIFO双端口RAM
同步状态机:
包括moore和mealy型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量)
状态机的开发步骤:
根据实际问题列出输入输出变量和状态数
画出状态图并化简
写出状态转移真值表得到逻辑表达式
用D触发器或JK触发器构建电路(目前用D触发器多)
verilog描述时只需要得到简化的状态图就可以描述
状态编码方式:
独热码格雷码
状态机主体程序有单always描述方式和多always描述方式
采用case/casez/casex建立模型最好,因为x是无关态,生成的电路最简单
default:
state='
bx与实际情况更一致,效果等同于default:
state<
=idle
只有同步状态机才能被目前的综合
for语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和case语句说明所有情况
有优先级的ifelse结构会消耗更多资源,建议用无优先级的case替代
模块的复用往往比代码上修改节省的资源多
PLL的分频、倍频、移相操作会增加设计精度
同步时序电路的延时:
#x通常用于仿真测试,实际硬件延时是:
长延迟用计数器,小延迟用D触发器,此方法用来取代延迟链
同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间
reg类型在always中不一定综合成时序电路,也可能是组合逻辑电路
乒乓操作与作用异步时钟域同步问题
延迟包括门延迟和线延迟
组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下
增减敏感信号得到的结果一样
补充部分:
verilogHDL起初是作为写testbench而产生的
verilog有1995进入IEEE标准,为IEEE-1364,于2001年进行了扩展,为IEEE1364-2001;
verilogAMS可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;
verilog的标识符区分大小写,关键字使用小写;
用\\来进行单行注释,用\**\来进行跨行注释;
标识符由字母、数字、下划线构成,并以字母开头;
关键字又叫保留字,只有小写的关键字才是保留字;
信号的状态有4种:
01xz
x和z在描述电路时不区分大小写,在仿真时大小写有不同意义;
常量表达式中:
xz不区分大小写;
进制符号hodb与HODB不区分大小写;
十六进制中a~f不区分大小写;
下划线_用于提高可读性;
?
在数中可以代替z;
x和z的左端补位;
字符和字符串都以ASICII码形式存在,也可以当成电路内的信号;
字符串必须包含在同一行,不能分成多行书写;
如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成8位的ASCII值序列;
可综合的信号类型:
wireregmemory它们用来描述数字电路
不可综合的数据类型:
integerreal它们只用仿真,位于testbench中
wire是连线的抽象模型,不能保存数据,其值由驱动元的值决定;
wire不能用在always或initial块中;
wire的默认值为高阻z;
wire的使用情形:
1.作为模块的输出端口2.用连续赋值语句assign赋值;
reg是1位寄存器(触发器)的抽象模型,可以保存数据;
reg必须用在always或initial块中;
reg的默认值为x;
reg的使用情形:
1.阻塞赋值<
=2.非阻塞赋值=
memory只能是一维的;
memory只能对每个单元分别初始化,方法:
1.一个一个赋值2.通过系统任务$readmem赋值
reg[3:
0]fc;
//一个4位寄存器regfc[3:
0]//4个一位寄存器
parameter的作用:
仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;
关系运算符将以逻辑1或逻辑0返回比较的结果;
==!
=的返回值有01x三种情况,===!
==的返回值只有01两种情况;
verilog由于是描述电路的,用于位的操作较多,有:
位逻辑操作,移位操作,并置操作,归约操作;
位逻辑运算的结果中,位数与原操作数一样多;
归约符是在原操作数的所有位上进行操作,并产生1位结果;
并置运算可以发生在bit与bit之间bit与矢量之间矢量与矢量之间
用于仿真的系统任务:
所有系统任务都必须在initial或always内;
所有系统任务都必须以$开头;
常见系统任务:
显示任务($diplay系列和$write系列)
监控任务($monitor系列)
探测任务($strobe系列)
文件打开、输入、关闭任务(&
fopen&
fclose&
fdisplay...)
读取文件任务($readmemb$readmemh)
仿真结束控制任务($finish$stop)
随即信号任务($random)
过程块:
initial块和always块
一个module内可以包含多个initial或always模块;
所有initial或always块在0时刻开始并行执行,各initial或always块内部顺序执行;
initial过程块主要是面向testbench的,通常不具有可综合性;
always过程块在描述电路时既可以描述组合逻辑电路(电平敏感)又可以描述时序逻辑电路(边沿敏感);
写testbench时initial通常用于初始化以及顺序波形的描述,always通常用于重复波形的描述;
任务task与函数function:
为了描述模块中被多次执行的部分以及为了增强代码的易读性
verilog中的高级程序语句如for循环语句只用在写testbench中;
beginend和forkjoin是两种特殊的括号
if语句的第三种形式适合描述优先编码器,case语句适合描述数据选择器和状态机;
case的条件表达式如果与分支项表达式长度不同,则在比较前将所有表达式都统一为这些表达式的最长长度;
casez忽略z,casex忽略z和x;
assign语句只在右端表达式发生变化时才重新计算并重新赋值,其余时间都是连续赋值;
assign语句可以指定bit、vector或是任意拼接操作的结果;
assign语句是连续赋值的,用于驱动网线wire,reg类型不需要连续赋值,reg类型一旦被赋值就会一直保存;
过程赋值语句有两种:
阻塞式=和非阻塞式<
=,只能在过程块initial和always中使用;
@对事件触发的控制与wait语句不能同时使用;
1.VerilogHDL中有两类数据类型:
线网数据类型和寄存器数据类型。
线网类型表示构件间
的物理连线,而寄存器类型表示抽象的数据存储元件。
(1)线网型:
wire和tri
由于线网类型代表的是物理连接线,因此它不存贮逻辑值。
必须由器件所驱动。
通常由assign进行赋值。
如assignA=B^C;
当一个wire类型的信号没有被驱动时,缺省值为Z(高阻)。
信号没有定义数据类型时,缺省为wire类型。
tri主要用于定义三态的线网。
(2)寄存器类型
寄存器类型的值可取负数,但若该变量用于表达式的运算中,则按无符号类型处理,如:
regA;
A=-1;
则A的二进制为 1111,在运算中,A总按无符号数15来看待。
用寄存器数组类型来建立存储器的模型,如对2个8位的RAM建模如下:
reg[7:
0]Mem[0:
1];
对存储单元的赋值必须一个个赋值,如上2个8位的RAM的赋值必须用两条赋值语句:
Mem[0]=’h55;
Mem[1]=’haa;
在VerilogHDL中定义了如下规则:
表达式中的所有中间结果应取最大操作数的长度(赋值时,此规则也包括左端目标)。
考虑另一个实例:
wire[4:
1]Box,Drt;
wire[5:
1]Cfg;
wire[6:
1]Peg;
wire[8:
1]Adt;
assignAdt=(Box+Cfg)+(Drt+Peg);
表达式右端的操作数最长为6,但是将左端包含在内时,最大长度为8。
所以所有的加操作使用8位进行。
例如:
Box和Cfg相加的结果长度为8位。
如果操作数中有一位为X或Z,那么结果为X。
23>
45结果为假(0)
而:
52<
8'
hxFF,结果为x。
在逻辑相等与不等的比较中,只要一个操作数含有x或z,比较结果为未知(x),如:
假定:
Data='
b11x0;
Addr='
那么:
Data==Addr比较结果不定,也就是说值为x。
2.在数字电路设计中,数字电路可简单归纳为两种要素:
线和器件。
线是器件管脚之间的物理连线;
器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存器、RAM等)。
3.Modulemodule_name(port1,port2,......);
input,output,inout,
reg,wire,parameter,
function,task,...
Initialstatement
Alwaysstatement
Moduleinstantiation
Gateinstantiation
Continuousassignment
Endmodule
4.三种建模方式
在HDL的建模中,主要有结构化描述方式、数据流描述方式和行为描述方式。
(1)结构化的建模方式就是通过对电路结构的描述来建模,即通过对器件的调用(HDL概念称为例化),并使用线网(内部采用wire来定义连线)来连接各器件的描述方式。
这里的器件包括VerilogHDL的内置门如与门and,异或门xor等,也可以是用户的一个设计。
结构化的描述方式反映了一个设计的层次结构。
(2)数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模。
最基本的机制就是用连续赋值语句。
在连续赋值语句中,某个值被赋给某个线网变量(信号)。
(3)行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模。
在表示方面,类似数据流的建模方式,但一般是把用initial块语句或always块语句描述的归为行为建模方式。
行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等。
5.数的表示方法
4'
d-4非法:
数值不能为负
8'
h2A在位长和字符之间,以及基数和数值之间允许出现空格
3'
b001非法:
`和基数b之间不允许出现空格
(2+3)'
b10非法:
位长不能够为表达式
6.字符串型
字符串是双引号内的字符序列。
字符串不能分成多行书写。
"
INTERNALERROR"
REACHED->
HERE"
用8位ASCII值表示的字符可看作是无符号整数。
因此字符串是8位ASCII值的序列。
为存储字符串“INTERNALERROR”,变量需要8*14位。
reg[1:
8*14]Message;
...
Message="
7.case
如果相应的标记是第一个符合case表达式的标记case只会执行这个分支Case的标记不需要互斥因此当相同的标记被错误地重复使用时Verilog编译器不会报告出错。
练习1:
设计一个字节(8位)比较器。
要求:
比较两个字节的大小,如a[7:
0]大于b[7:
0]输出高电平,否则输出低电平,改写测试模型,使其能进行比较全面的测试。
modulecompare_8(a,b,out);
parameterWIDTH=8;
input[WIDTH-1:
outputout;
regout;
always@(aorb)
begin
if(a>
b)
out=1;
else
out=0;
end
endmodule
测试:
`timescale1ns/1ns
`include"
./compare_8.v"
modulecompare_8test;
reg[7:
0]a,b;
//这很重要,要是没有这的定义,输入实际就是1比特
wireout;
initial
a=8'
b0;
b=8'
#100a=8'
b00000000;
b=8'
b00000001;
b00001111;
b00000011;
b11111111;
#100$stop;
//系统任务,暂停仿真以便观察仿真波形。
compare_8compare_8(.out(out),.a(a),.b(b));
//调用模块。
练习2:
六分频
moduleeven_6(clk_in,clk_out,rst_n);
inputclk_in;
inputrst_n;
outputclk_out;
parameterN=6;
reg[3:
0]cnt;
regclk_out;
always@(posedgeclk_inornegedgerst_n)begin
if(!
rst_n)begin
cnt<
=4'
b0000;
clk_out<
=0;
elseif(cnt==(N/2-1))begin
=~cl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 Verilog 关键字 整理 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)