基础笔记:Verilog HDL(未完成)

来源:互联网 发布:知乎文章搜索 编辑:程序博客网 时间:2024/05/18 01:08

2.1Verilog HDL语言要素

空白符:包括空格符(\b)、制表符(\t)、换行符(\n)和换页符 

在非字符串中出现,在编译和综合时,空白符被忽略。

在字符串中,\n \t \\ \" \ddd(3位八进制表示的ASCII码)

注释符:多行注释可以嵌套单行注释

标识符:被用来命名信号名、模块名、参数名等

        它可以是任意一组字母、数字、$ 符号和 _(下划线)符号的组合

        应该注意的是标识符的字母区分大小写,并且第一个字符必须是字母或者下划线。

转义标识符:在标识符基础上可以包含任何可打印字符 

            以“\”(反斜线)符号开头,以空白符结尾(可以是一个空格、一个制表字符或换行符)

关键字:所有关键字都是小写的

2.2数据类型

四种基本的逻辑数值状态:    0 低电平、逻辑0或“假”      1 高电平、逻辑1或“真”

                        x或X 不确定或未知的逻辑状态  z或Z 高阻态

整数:+/-<size>’< base_format >< number >

      size不能是表达式形式 

      '和base_format之间不允许出现空格 b/o/d/h或B/O/D/H

      number不能为负 有负号应放最左边 除了基本数码还可以为x/X/z/Z/?/_(下划线提高可读性)

实数:采用十进制格式,小数点两边必须都有数字

      采用科学计数法,可用e或E表示 两种常量转换时通过四舍五入,而不是舍弃小数

物理数据类型:连线型、寄存器型和存储器型

<net_declaration><drive_strength><range><delay>[list_of_variables]; 

连线型:net_declaration

wire/tri      标准连线(缺省为该类型)(三态线)  wor/trior 多重驱动时,具有线或特性的连线型

wand/trand 多重驱动时,具有线与特性的连线型   trireg 具有电荷保持特性的连线型数据(特例)

supply1/supply0电源线 用于对电源/对地建模,为高电平1/低电平0

tri1/tri0  上拉电阻/ 下拉电阻(处于三态)

信号强度:表示数字电路中不同强度的驱动源,用来解决不同驱动强度存在下的赋值冲突drive_strength

supply电源级驱动 驱动  strong强驱动 驱动     pull上拉级驱动 驱动    large大容性 存储

weak 弱驱动 驱动        medium中性驱动 存储   small小容性 存储       highz高容性 高阻

range 缺省为1位 连线型中为1位标量形式,超过1位为矢量形式[msb,lab]

delay 指定延迟时间

reg<range>[list_of_register_variables];

寄存器型:

reg型是数据储存单元的抽象类型 常用于行为级描述

一般为无符号数,若将一个负数赋给reg型变量,则自动转换成其二进制补码形式

reg <range1>[list_of_memory_variables]<range2>;

储存器型:描述RAM型、ROM型存储器以及reg文件

<range1>:表示存储器当中寄存器的位宽 <range2>:表示msb-lsb+1个寄存器

其他合法声明:

reg <range1>[list_of_memory_variables]<range2>,[list_of_register_variables];

wire(pull1,strong0)c=a+b;//定义一个1和0的驱动强度不同的1位连线型变量c

trireg(large) storeline; //定义一个具有大强度的电荷存储功能的存储线

抽象数据类型:

整型;integer[list_of_register_variables]<range>;

实型:real 在机器码表示法中是浮点型数值,可用于对延迟时间的计算。

时间型:time 64位的无符号数 对模拟时间的存储与计算处理,常与系统函数$time一起使用

参数型:属于常量,在仿真开始之前就被赋值,在仿真过程中保持不变 parameter 参数=表达式,...;

位选择和部分选择:net_or_reg_vector[bit_select_expr] / net_or_reg_vector [msb:1sb]

2.3运算符和表达式

              :反逻辑、位反相       !   ~  

算术操作符    :乘、除、取模 加、减  *   /   % 、+   - 结果的位宽由最长的操作数决定

移位运算符    :左移、右移 <<    >> 用0来填补移出的空位

关系操作符    :小于、小于等于、大于、大于等于 <   <=   >   >=

相等关系操作符:等、不等、全等、非全等 ==  !=  ===  !== 

按位运算符    :按位与 按位逻辑异或和同或 按位逻辑或 & 、^   ^~ 、| 对应位上按位产生向量结果

逻辑运算符    :逻辑与 逻辑或 && 、||  对于向量操作,非0向量作为1处理,存在x的结果也为x

条件运算符    :cond_expr ? expr1 : expr2

如果cond_expr 为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2。 

如果cond_expr 为x或z,结果将是expr1和expr2按位操作的值: 0与0得0,1与1得1,其余为x。

归约运算符    :与“&”、 或“|”、 异或“^”,以及相应的非操作“~&”、“~|”、“~^”、“^~”

                从最高位逐次与下一位进行运算

连接操作符   :{信号1的某几位,信号2的某几位,…,信号n的某几位}、

重复操作符    :{N{}}将一个表达式放入双重花括号中,复制通过指定重复次数N来执行操作 

2.4模块module:用于描述某个设计的功能或结构以及与其它模块通信的外部端口。

(1)模块的开始与结束:以关键词module开始,以关键词endmodule结束的一段程序,其中模块开始语句必须要以分号结束。

(2)端口定义:用来定义端口列表里的变量哪些是输入(input)、输出(output)和双向端口(inout)以及位宽的说明。

(3)数据类型说明:数据类型在语言上包括wire、reg、memory和parameter等类型,用来说明模块中所用到的内部信号、调用模块等的声明语句和功能定义语句。

(4)逻辑功能描述:主要用来产生组合逻辑和时序逻辑。

主要包括以下部分:initial语句、always语句、其它子模块实例化语句、门实例化语句、用户自定义原语(UDP)实例化语句、连续赋值语句(assign)、函数(function)和任务(task)。

模块引用时端口的对应方式

(1)在引用时,不标明源模块定义时规定的端口名,严格按照模块定义的端口顺序来连接。格式如下:

模块名(连接端口1信号名,连接端口2信号名...);

(2)在引用时用“.”标明源模块定义时规定的端口名。用端口名与被引用模块的端口对应,可以不必严格按端口顺序对应,提高了程序的可读性和可移植性。格式如下:

模块名(.端口1名(连接信号1名),.端口2名(连接信号2名)...);

3.程序设计语句和描述方式

模块描述定义行/端口类型说明/数据类型说明/描述体/结束行 其中 描述体:连续赋值语句(assign)/N个过程块

      过程块:过程语句(initial/always)/N个语句块 begin-end/fork-join

      语句块:过程赋值语句/高级程序语句

描述体:

连续赋值语句:

显式连续赋值语句:

wire <range><name>;assign #<delay><name>= assignment expression;

隐式连续赋值语句:

wire < drive_strength ><range>#<delay><name>= assignment expression;

赋值目标只能是线网类型(wire);连续赋值语句不能出现在过程块中。

只要赋值语句右边表达式任何一个变量有变化,若没有定义延时量,表达式立即更新左边信号

多个连续赋值语句之间是并行语句,因此与位置顺序无关。

连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会体现在输出端口上。

过程块

过程语句:被赋值信号必须定义为“reg”类型。

initial+语句块;

always@(<敏感事件列表>)+语句块; 只要满足敏感事件列表就执行语句块

敏感事件:关键字posedge/negedge+变量名:变量的上升沿/下降沿的到来  

           变量名:变量的值发生改变时

(1)采用过程对组合电路进行描述时,作为全部的输入信号需要列入敏感信号列表。

(2)采用过程对时序电路进行描述时,需要把时间信号和部分输入信号列入敏感信号列表。

应当注意的是,不同的敏感事件列表会产生不同的电路形式。 

语句块

串行语句块有以下几个特点:

(1)串行语句块采用关键字“begin”和“end”,按串行方式顺序执行,先后逐条顺序执行。每条语句给出的延时都是相对于前一条语句执行结束的相对时间。可以用于可综合电路程序和仿真测试程序。电路中数据在时钟及控制信号作用下,沿数据通道的各级寄存器之间的传送过程

(2)并行语句块采用关键字“fork”和“join”,其中的语句按并行方式并发执行,块内语句则开始同时并行地执行,即程序流程控制一进入到该并行语句块,。只能用于仿真测试程序,不能用于可综合电路程序。块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的。电路上电后,各电路模块同时开始工作的过程

过程赋值语句:有阻塞性过程赋值语句和非阻塞性过程赋值语句

     阻塞赋值语句的操作符号为“=”,语法格式是:变量=表达式;

   (1)在串行语句块中,各条阻塞赋值语句将按照先后排列顺序依次执行;在并行语句块中的各条阻塞赋值语句则同时执行,没有先后顺序之分;

   (2)执行阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后立刻将计算的值赋给左边的变量,与仿真时间无关。

非阻塞赋值语句的操作符号为“<=”, 语法格式是:变量<=表达式。

  (1)在串行语句块中,各条非阻塞赋值语句的执行没有先后顺序之分,排在前面的语句不会影响到后面的语句的执行,各条语句并行执行;

  (2)执行非阻塞赋值语句的顺序是,先计算右端表达式的值,然后等到延时时间结束时,将计算的值赋给左边的变量。

过程性连续赋值语句:赋值、重新赋值语句(assign、deassign)和强制、释放语句(force、release)。

assign <寄存器型变量> = <赋值表达式>;

deassign <寄存器型变量>;

force <寄存器或连线型变量> = <赋值表达式>;

release<寄存器或连线型变量>;

“force”语句的优先级高于“assign”语句。

条件分支语句:if条件语句和case条件分支语句

形式1:if(条件表达式) 语句块;

形式2:if(条件表达式) 语句块1;else 语句块2;

形式3:if(条件表达式1) 语句块1;else if(条件表达式2) 语句块2;...else 语句块n;

在if语句中允许一个或多个if语句的嵌套使用,

case条件分支语:可实现多路分支选择控制的语句,一般多用于多条件译码电路设计

case(控制表达式)值1: 语句块1 值2:语句块2...值n:语句块n default:语句块n+1 endcase

(1)值1到值n之间必须各不相同,一旦判断到与某值相同并执行相应语句块后,执行便结束。

(2)如果某几个连续排列的值项执行的是同一条语句,则这几个值项间可用逗号相隔,而将语句放在这几个值项的最后一个中。

(3)default选项:若当前面已经列出了敏感表达式的所有可能值,则default可以省略。

如果没包含全,那么缺省项必须写,否则将产生锁存器,这在同步时序电路设计中是不允许的。

(4)case语句的所有表达式的位宽必须相等,只有这样控制表达式和分支表达式才能进行对应位的比较。

其中case必须完全匹配 而casez中只有z可以与任何状态匹配,casex中x和z可以与任何状态匹配

赋值语句:连续赋值assign 过程赋值=、<=

过程语句:initial  always

语句块:串行语句块begin-end   并行语句块fork-join

条件语句:if-else    case,casez,casex

循环语句forever repeat while for

编译向导语句:define include ifdef,`else,`endif

原创粉丝点击