Verilog

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
优先级
非、取反:!~
算术:*/ %
算术:+ -
移位:<<>>
关系:<<= >>=
关系:==!====!==
位运算:&
位运算:^ ^~
位运பைடு நூலகம்:|
逻辑:&&
逻辑:||
条件:? :
Forever:连续执行一条语句
Forever语句;
或者foreverbegin多条语句end
必须写在initial快中。
Repeat:连续执行一条语句n次
$write();
用来输出信息。display自动地在输出后进行换行,write不是这样
%h以十六进制数的形式输出
%d十进制
%o八进制
%b二进制
%c以ASCII码字符的形式输出
%v输出网络型数据信号强度
%m输出等级层次的名字
%s字符串
%t以当前时间格式输出
%e以指数形式输出实型数
%f以十进制数的形式输出实型数
只有输出端才可以被定义为寄存器类型变量
initial语句用于为时序电路内部寄存器赋初值,只能是0,1,x
综合器之所以能实现乘法器电路,是因为:库中已经存在着“可配置的参数化乘法器的电路结构”和“相应的行为模型”
在编译预处理时将宏名替换成字符串的过程称为“宏展开”
在引用已定义的宏名时,在宏名的前面加上符号“`”
宏定义不是Verilog语言,不需要加“;”号
文件包含:`include:一个源文件可以将另一个源文件的全部内容包含进来。
格式:`include“文件名”
被包含文件名可以是相对路径,也可以是绝对路径
时间尺度:`timescale:用来说明跟在命令后的模块的时间单位和时间精度
$monitoroff关闭监控标志,$monitoron打开监控标志
多模块调试的情况下,许多模块中都调用了$monitor,因为任何时刻只能有一个$monitor起作用,因此需配合$monitoroff和$monitoron使用,把监控的模块用$monitoron打开,在监控完毕后及时用$monitoroff关闭。
@(*):对其后语句块中所有输入变量的变化敏感。
电平敏感时序控制:另一种形式的电平敏感时序控制
always
wait(count_enable) #2 count=count+1;
count_enable为1时执行后面的语句
count_enable为0时,不执行后面的语句,仿真会停顿下来
task:
定义:
任务和函数:
1都是用来对设计中多处使用的公共代码进行定义
2任务:可以任意多输入多输出;任务中可以使用延时、时序控制,在任务中可以调用其他的任务和函数
3函数:只能有一个返回值,并至少有一个输入值,在函数中不能使用延时、事件和时序控制结构,可以调用其他函数,但不能调用任务。
系统任务:
$display();
task<任务名>;
<端口及数据类型声明语句>
<语句1>
……
<语句n>
endtask
task调用:my_task(v,w,x,y,z);
parameter
module Decode(A,F);
parameter width=1,polarity=1;
endmodule
调用:Decode #(4,0) D1(A1,F1)//改变定义模块里面的常数:#()
系统函数和任务前面都有$标识符,系统的函数和任务具有强大的功能。
$fopen
$fclose
$fdisplay
$fmonitor
系统任务:$monitor
$monitor提供监控和输出参数列表中的表达式或变量值的功能。
启动一个$monitor任务时,仿真器会建立一个处理机制,使得每当列表参数变化时,整个参数列表中变量或表达式的值都将输出显示。
4、必须有一条赋值语句给函数中的一个内部变量
递归函数
例如:functionautomaticinteger factorial;
使用关键字automatic,函数将成为自动的或可递归的,即:仿真器为每次函数调用自动地分配新的地址空间,每次函数调用对各自的地址空间进行操作,因此,自动函数中声明的局部变量不能通过层次名进行访问。
位移运算符:>>右移,<<左移
条件运算符:?:
拼接运算符:{}例如:{a,b[3:0],w,3’b101}, {b,3{a,b}}={b,a,b,a,b,a,b},Assign{cout,sum}=a+b+cin;
缩减运算符:!,&, |,如:reg[3:0]B;regC; C=&B
相当于:C=((B[0]&B[1])&B[2])&B[3]
表达式值的部分为是不定值,输出结果为大写的X
层次显示:
$display(“Displaying in %m”);
可以显示全层次路径名,,包括模块实例、任务、函数和命名快。
选通显示:$strobe
与$display的不同点在于:执行顺序不同,$strobe可以确保在同一时钟沿赋值语句执行完后才显示数据。$display没有这样的特点,这样就会导致,在同一时钟沿,赋值语句还没执行完,$display就已经完成了赋值,导致结果不一样。
$readmemb和$readmenh
前一个要求所读文件中的数据是二进制的,后一个要求所读文件中的数据是十六进制的
读取内容:空白位置、注释行、二进制或十六进制的数字
数据文件,地址格式:@hhh即:@后面跟上十六进制数
$random:产生随机数
$random %b:产生一个范围在(-b+1)~(b-1)的随机数
例如:reg[23:0] rand;
rand=$random % 60 //产生-59~59之间的数
reg[23:0] rand;
rand=$random % 60; //产生0~59之间的数
编译预处理:
宏定义:`define:用一个指定的标识符来表示一个字符串:
格式:`define标识符(宏名)字符串(宏内容)
%g以指数或十进制形式输出实型数,以较短的结果输出
\n换行
\t横向跳格
\\反斜杠
\”双引号
\o 1~3位八进制数代表的字符例如:\123位ASCII码值位83的符号
%%百分号
%0d,%与表示进制的字符中间插入0,自动调整显示输入数据宽度的方式,总是用最少的位数来显示表达式的当前值。
表达式值得所有位均为不定值,输出结果为小写的x
Running the synthesis process
You can synthesize your design once design files have been created. The synthesis process will check codesyntaxand analyze thehierarchyof your design which ensures that your design is optimized for the design architecture you have selected. The resulting netlist is saved to an NGC file (for Xilinx® Synthesis Technology (XST)) or an EDIF file (for Precision, or Synplify/Synplify Pro).
用户定义的原语
定义UDP的语法
primitive元件名(输出端口名,输入端口名1,……,输入端口名10)
output输出端口名;
input输入端口名1,输入端口名2,……;
reg输出端口名;
initial begin
输出端口寄存器或时序逻辑内部逻辑寄存器赋初值(0,1,x)
end
table
//输入1输入2输入3:输出
function
function<返回值的类型或范围>(函数名)
<端口说明语句>
<变量类型说明语句>
begin
<语句>
end
endfunction
函数的定义把函数返回值所赋值寄存器的名称初始化位与函数同名的内部变量。
1、函数的定义不能包含任何的时间控制语句,#@wait
2、函数不能启动任务
3、定义函数时至少要有一个输入变量
常量函数:实际上是带有某些限制的常规函数
例如:function integer example1(inputinteger depth)
带符号函数:返回值可以作为带符号数进行运算
例如:function sighed[31:0] compute_sighed(input [31:0] vector);
逻辑值逻辑值逻辑值:逻辑值;
逻辑值逻辑值逻辑值:逻辑值;
逻辑值逻辑值逻辑值:逻辑值;
逻辑值逻辑值逻辑值:逻辑值;
endtable
endprimitive
UDP只有一个输出端,而且必定是端口说明列表的第一项
UDP可以有多个输入端,最多允许有10个输入端
UDP所有端口变量必须是标量,也就是必须是1位的
UDP的真值表中,只允许出现0,1,x的三种逻辑值
Repeat(表达式)语句;
Repeat(表达式)begin多条语句end
While:执行一条语句直到某条条件不满足
While(表达式)语句;
While(表达式)begin多条语句end
Disable作用:1,从循环中退出;2,处理错误条件;3,根据控制信号来控制某些代码段是否被执行。
begin:block1//命名快:可以声明静态本地变量;可以被禁用;声明的变量可以通过层次名引
程序段1
`else
程序段2
`endif
`ifdef宏名
程序段1
`endif
条件执行:$test$plusargs
控制条件执行:$value$plusargs
模块实例化:
定义模块时:输入:wire输出:wire/reg
实例化模块:输入:wire/reg输出:wire
integer可为负数
reg为非负数
Verilog提供了一套完整的表示组合逻辑的基本元件的原语(primitive)
运算符
赋值运算符:=,<=
算术运算符:+,-,*,/,%取模
位运算符:&按位与,|按位或,~取反,^按位异或,^~按位同或,~^
关系运算符:<, >, >=,<=
相等运算符:==,!=,(===,!==不可综合)
逻辑运算符:!,&&,||
while(i<16)//用进行访问
begin
if(flag[i])
begin
$display(“Encountered a True bit at element number %d”,i);
disableblock1;//禁止快block1执行
end
i=i+1;
end
end
数据类型:
net(网线)reg(寄存器)
格式:`timescale<时间单位>/<时间精度>
解释:模块中所有的时间值都是<时间单位>的整数倍,<时间精度>用来使得时间值整数化,例如:时间值15.5ns,时间精度为1ns,时间值取整后位16ns。
秒S
毫秒ms 10-3
微秒us 10-6
纳秒ns 10-9
皮秒ps 10-12
飞秒fs 10-15
integer(整型数)real(实型数)time(时间型)realtime(实数时间型)
event(事件)
always@(敏感列表)
begin
end
敏感列表:可以是沿触发,也可以是电平触发
沿触发:只要指定的沿出现,就立即执行一次过程快
电平触发:只要电平变化,就会执行一次过程快
敏感表中存在多个信号或者事件,他们之间要用“or”或者“,”间隔
条件编译:`ifdef `ifndef `else `elsif `endif
只有在满足条件时才进行编译;该命令可以出现在任何地方,可以有条件的编译语句、模块、语句块、声明和其他编译指令。
条件编译标志(宏名)可以用`define语句来设置。
`ifdef宏名//如果宏名已经被定义过编译程序段1,否则编译程序段2;
相关文档
最新文档