第2章 Verilog 语言规则(修改)

合集下载

自己总结的verilog规则

自己总结的verilog规则
38、并位操作符{}
39、时序逻辑电路中if条件下一般用<=运算符
40、if()
begin
……
end
else if()
begin
……
end
else if()
begin
input ;
reg ;
integer ;
……
begin
……
end
24、reg mema [7:0](8个1位寄存器构成组成)reg [7:0] mema(1个8为寄存器)可用mema[4]引用前者。
25、并行块:fork...join(不可用于RTL代码设计,只可用于测试代码) 顺序块begin...end
26、initial和fork...join均不可综合
括号可为空,此时不断循环,另外begin与end间被赋值的变量必须为reg型直接用=赋值
always@()
begin
#10 clk=1;
#10 clk=0;
else
例:边沿触发 always@(negedge clk)
...
11、仿真时用initial类似always,不可综合
12、例化时实参与形参顺序相同则不需写形参,若形参、实参都写则可调换顺序
13、assign并不需要在always中,也可以在外面
44、任务的定义与调用
task my_task;
input a,b;
output c,d;
一个或多个赋值表达式;
endtask(无分号)
end
可在其中使用if语句
9、always可用于描述组合逻辑电路
也可用于描述时序逻辑电路,区别在于时序电路敏感信号一般为上升沿或下降沿

第04讲 Verilog-HDL语法——第2部分 语法要点

第04讲 Verilog-HDL语法——第2部分 语法要点

` timescale
`timescale 说明延时单位及延时精度
格式:`timescale <time_unit> / <time_precision> 如:`timescale 1 ns / 100 ps
`timescale必须在模块之前出现 `timescale 1 ns / 100 ps // All time units are in multiples of 1 nanosecond module MUX2_1 (out, a, b, sel); output out; input a, b, sel; wire sel_;
12 'H83a 8'b1100_ 0001 64'hff01 9'O17 32'bz01x 3’b1010_ 1101 6.3 32e- 4 4.1E3 unsized decimal (zero-extended to 32 bits) unsized hexadecimal (zero- extended to 32 bits) 8-bit binary 64-bit hexadecimal (zero- extended to 64 bits) 9-bit octal Z-extended to 32 bits 3-bit number, truncated to 3’b101 decimal notation scientific notation for 0.0032 scientific notation for 4100
hex
oct
dec
bin
ACSII
string
time
strength module
转义符
\t \n \\ \” %% \<1-3 digit octal number>

《Verilog HDL数字设计与综合(第二版)》教学课件—第2章

《Verilog HDL数字设计与综合(第二版)》教学课件—第2章
Page ▪ 14
2.6 自顶向下的设计实例
▪ 例2.3 脉动进位计数器顶层模块
Page ▪ 15
2.6自顶向下的设计实例(续)
▪ 例2.4 触发器T_FF
Page ▪ 16
2.6自顶向下的设计实例(续)
▪ 例2.5 带异步复位的D触发器 D_FF
Page ▪ 17
▪ 例2.6 激励模块
Page ▪ 18
▪ 在自底向上的设计方法恰好与此相反:我们不断地使用较小的功能块来搭建大一些 的模块。首先使用与门和或门搭建D触发器,或者使用晶体管搭建一个自定义的D触 发器,使自底向上和自顶向下的方法在D触发器这个层次上会合。
Page ▪ 4
2.3 模块
▪ Verilog使用模块(module)的概念来代表一个基本的功能块。一个模块可 以是一个元件,也可以是低层次模块的组合。常用的设计方法是使用元件 构建在设计中多个地方使用的功能块,以便进行代码重用。模块通过接口 (输入和输出)被高层的模块调用,但隐藏了内部的实现细节。这样就使 得设计者可以方便地对某个模块进行修改,而不影响设计的其他部分。
Page ▪ 2
2.1 设计方法学
▪两种基本的设计方法:自底向上和自顶向下设计方法 ▪ 自底向上设计方法:
首先定义顶层功能块,进而分析需要 哪些必要的子模块;然后进一步对各 个子模块进行分解,直到达到无法进 一步分解的底层功能块 ▪ 自顶向下设计方法: 首先对现有的功能块进行分析,然后 使用这些模块来搭建规模大一些的功 能块,如此继续直至顶层模块
Page ▪ 7
2.3 模块(续)
▪ Verilog允许设计者在一个模块中混合使用多个抽象层次。在数字电路设计 中,术语寄存器传输级(RTL)描述在很多情况下是指能够被逻辑综合工 具接受的行为级和数据流级的混合描述。

了解VerilogHDL语法规则吗,看完这篇就知道了

了解VerilogHDL语法规则吗,看完这篇就知道了

了解VerilogHDL语法规则吗,看完这篇就知道了本节介绍Verilog HDL语法规则,包括文字规则、数据对象及运算符的使用等。

Verilog HDL文字规则1.关键词与标识符关键词是Verilog HDL中预先定义的单词,它们在程序中有特别的使用目的。

已经被用作关键词的单词不可以在程序中另作他用,见表3-1。

不同版本的Verilog HDL硬件描述语言中定义的关键词数目略有变化,Verilog 1995的关键词有97个,Verilog 2001共102个。

标识符是用户编程时给对象定义的名称,对象包括:常量、变量、模块、寄存器、端口、连线、示例和beginend块等元素。

定义标识符时应遵循如下规则:只能由26个大小写英文字母、数字和下划线组成。

标识符的第一个字符必须是英文字母或下划线。

字符中的英文字母区分大小写。

【例3-7】判断下面标识符是否合法。

2.注释与C语言一样,硬件描述语言中的注释也不会被编译。

在Verilog HDL中有两种形式的注释方式:采用/* */,多用于多行注释。

采用//,用于单行注释。

【例3-8】注释举例。

在实际使用中,很多公司的编程规范明确表明,注释行中不提倡采用第一种/**/的注释方式,不允许使用中文注释。

3.常数的表示在Verilog HDL中,常数用来表示在程序中不随意变化的量,常数分为整数、实数及字符串三大类型。

(1)整数型常数是数字电路中最常用到的类型,在Verilog HDL中有两种表示方法:简单的十进制格式,例如-50、6等。

基数格式,其表达方式一般如下:〈位宽〉是十进制数值表示的常数化成二进制时对应的宽度,〈进制符号〉用进制符号b或B(二进制)、o或O(八进制)、d或D(十进制)、h或H(十六进制)表示常数的进制格式,即二进制、八进制、十进制、十六进制这4种进制表示。

数字的位宽可以默认,如果没有定义长度,数的长度由具体机器系统决定(至少是32位)。

【例3-9】常数表示方法举例。

Verilog程序编写规范

Verilog程序编写规范

Verilog程序编写规范在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。

良好代码编写风格的通则概括如下:一、命名规则(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对参数名、常量名和用户定义的类型用大写;(2)使用有意义的信号名、端口名、函数名和参数名;(3)信号名长度不超过20个字符;(4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;(6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。

注意在同一个设计中要使用同一个小写字母表示低电平有效;(7)对于复位信号使用reset 作为信号名,如果复位信号是低电平有效,建议使用reset_n;(8)当描述多比特总线时,使用一致的定义顺序,采用从高到低的定义顺序。

对于verilog 建议采用bus_signal[x:0]的表示;(9)尽量遵循业界已经习惯的一些约定。

如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;二、文档结构(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;// +FHDR-------------------------------------------------------------------// Copyright @ 2008, State Key Laboratory of Advanced Optical Communication Systems & Networks, PKU // ----- -----------------------------------------------------------------------// FILE NAME:// AUTHOR:// DATA OF CREATION:// -----------------------------------------------------------------------------// PURPOSE://// --- -----------------------------------------------------------------------// RELEASE HISTORY:// DATA AUTHOR DESCRIPTION//// --- -----------------------------------------------------------------------// -FHDR-------------------------------------------------------------------//(11)使用适当的注释来解释所有的进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。

VerilogHDL语言(PDF)

VerilogHDL语言(PDF)

Verilog 讲义(二)1)续Verilog 基础2)Verilog 形为描述3.4 运算符九类运算符分类包含运算符算术运算符+ - * / %位运算符~ & | ^ ^~or~^缩位运算符& ~& | ~| ^ ^~or~^逻辑运算符! && ||关系运算符> < <= >=相等与全等运算符== != === !==逻辑移位运算符 <<>> 连接运算符 {}: 条件运算符 ?根据操作数的不同,又可分为三类:1)单目运算符只有一个操作数,且运算符位于操作数的左边如:~clk &a ~& 缩位运算符wire [7:0] aparity=^a (奇校验)2)双目运算符a+b a%b {a,b,c}3)三目运算符out=(sel)?a:b;运算符的优先级参:P443.4.1 算术运算符1)减法亦可用作单目运算符,取补运算2)除法运算符:整型类数据小数部分被截去: integer a=7/2=33)% 取余运算 7%2=13.4.2 位运算符1)~a 按位取反2)a&b 按位相与若a,b 位数不同,短的高位补0,(x者补x)3)^ ^~ 双目3.4.3 缩位运算符单目运算符,按位进行逻辑运算,结果产生一位的逻辑值。

A=4’b1001&a ~&a |a ~|a ^a ~^a0 1 1 0 1 0 3.4.3 逻辑运算符a&&b结果为一位的逻辑值若操作数为多位,只要有一位为1,整个操作数看作逻辑1;若有不定态,结果亦为不定态。

3.4.5关系运算符结果为一位的逻辑值。

3.4.6 相等与全等运算符结果为一位逻辑值相等:比较每一位,所有相等,关系满足,若有不定态或高阻态,不定态结果。

全等:与相等比较过程相同,亦将不定态及高阻态作为逻辑状态比较。

3.4.7 逻辑移位运算符<< >> 以0补位。

关于VerilogHDL编写规则的说明

关于VerilogHDL编写规则的说明

关于V erilogHDL编写规则的说明摘自“Comprehensive SRS V3 Standards—Semiconductor Reuse Standard”7 V erilog HDL 编码7.1 前言V erilog HDL编码标准属于虚拟部件生成一部分,用于对编码中的命名习惯、代码文档和代码格式风格的说明。

对相应规则的遵从能够简化重用,并从代码中抽象出其精华,使得代码可读性增强且兼容大多数工具。

除特别声明,任何与标准不一致的地方必须纠正而且以文档说明。

该标准确保在各种应用中代码的高度适应性,以此提升了重用性。

本文档的目的就是确保门级实现与标准的V erilog仿真器一致。

分割会影响针对应用的适应性。

建模实践小节处理在综合环境中很难描述清楚而又必须确保前后综合的一致性结构。

该标准可应用于行为和综合代码。

而且,还可以应用于其它的V erilog代码中如测试台、监视器等。

某些标准明确说明其应用代码的类型,如有例外会标出。

所描述的规则肯定是在快速Soc设计、集成、生产及维护过程中必须的要求项。

注意到在许多情况下,简单的介绍也能适应要求,但是,介绍会带来大量的例外、工具限制或一些深度的使用习惯,而这些与规则相悖。

7.1.1可交付的列表在第2部分VC块可交付列表已经定义了IP库形式。

包括:可综合的RTL源代码(L1)测试台(V1)驱动(V2)监视器(V3)详细行为建模(V4)短小模型(V6)形式模型验证(V12)7.2参考信息7.2.1参考文档略7.2.2术语基地址:偏移量相对的地址HDL:硬件描述语言屏蔽拴:物理上,屏蔽拴指一条连接到VDD或VSS,或者二个输入的选择输出线,用于对模块的配置而不会影响模块内部。

该设置能够在更改配置时避免重综合。

PLL:锁相环RTL:文本宏顶层模块:在VC设计层次中最高模块。

UDP:用户定义原语7.3命名规则7.3.1文件命名R7.3.1 一个文件一个模块一个文件最多可以有一个模块。

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 GuiderSun MicrosystemsRevision 1.0VerilogStyle and Coding Guidelines5 规范内容5.1 Verilog 编码风格本章节中提到的Verilog编码规则和建议适应于 Verilog model的任何一级( RTL behavioral,gate_level) 也适用于出于仿真,综合或二者结合的目的而设计的模块。

5.1.1 命名规范选择有意义的信号和变量名,对设计是十分重要的。

命名包含信号或变量诸如出处,有效状态等基本含义下面给出一些命名的规则。

1. 用有意义而有效的名字有效的命名有时并不是要求将功能描述出来如For ( I = 0; I < 1024; I = I + 1 )Mem[I]<= #1 32’b0;For 语句中的循环指针I 就没必要用loop_index作为指针名。

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 GuiderSun MicrosystemsRevisionVerilogStyle and Coding Guidelines5 规范内容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章 Verilog 语言规则(修改)

第2章 Verilog 语言规则(修改)

9.2 数 据 类 型
Verilog的数据类型及逻辑系统
学习内容:
学习Verilog逻辑值系统 学习Verilog中不同类的数据类型 理解每种数据类型的用途及用法 数据类型说明的语法
Verilog采用的四值逻辑系统
’0’, Low, False, Logic Low, Ground,VSS, Negative Assertion
trireg类型很象wire类型,但trireg类型在没有驱动时保持 以前的值。这个值的强度随时间减弱。
寄存器类 (register)
寄存器类型在赋新值以前保持原值
寄存器类型大量应用于行为模型描述及激励描述。在 下面的例子中,reg_a、reg_b、reg_sel用于施加激 励给2:1多路器。
第9章 Verilog语言规则
9.1 文字规则
常量(或常数)
整数类型(integer)(32位):可以被综合。 实数类型(real)(32位) 不可综合 字符串类型(strings)
9.1 文字规则
1. 整数
注意:
为了增加可读性,在较长的数间可用下划线分 开。
若不注明位宽和进制,或仅用D注明进制时, 都是十进制。如:123,’D12
‘1’, High, True, Logic High, Power, VDD, VCC, Positive Assertion
’X’ Unknown: OccuResolved Conflict
HiZ, High Impedance, Tri- Stated, Disabled Driver (Unknown)
注意integer和reg 类型在算术运算 时的差别。integer 是有符号数,而 reg是无符号数。

第2章 Verilog 语言规则

第2章 Verilog 语言规则
寄存器声明
<reg_type> [range] <reg_name>[, reg_name]; reg_type:寄存器类型 range: 矢量范围,以[MSB:LSB]格式。只对reg类型有效 reg_name :寄存器名称,一次可定义多个寄存器,用逗号分开
Verilog中net和register声明语法
example.v
修改前:
修改后: module example(o1, o2, a, b, c, d);
module example(o1, o2, a, b, c, d);
input a, b, c, d;
input a, b, c, d;
output o1, o2;
output o1, o2;
举例:
reg a; //一个标量寄存器 wand w; // 一个标量wand类型net reg [3: 0] v; // 从MSB到LSB的4位寄存器向量 reg [7: 0] m, n; // 两个8位寄存器 tri [15: 0] busa; // 16位三态总线 wire [0: 31] w1, w2; // 两个32位wire,MSB为bit0
DUT u1 (y, a, b) ;
wire Y, A, B;
initial begin
and (Y, A, B) ;
a = 0; b = 0;
endmodule
#5 a = 1;
end
在过程块中只能给 register类型赋值
endmodule
信号类型确定方法总结如下:
• 信号可以分为端口信号和内部信号。出现在端口列表中的 信号是端口信号,其它的信号为内部信号。
trireg类型很象wire类型,但trireg类型在没有驱动 时保持以前的值。这个值的强度随时间减弱。

Verilog语言编程规范

Verilog语言编程规范

前言 (IV)1范围 (1)2术语 (1)3代码标准 (1)3.1命名规范 (1)3.1.1文件命名 (1)3.1.2HDL代码命名总则 (2)3.2注释 (4)3.2.1文件头 (4)3.2.2其它注释 (5)3.3编程风格 (7)3.3.1编写代码格式要整齐 (7)3.3.2使用二到四个空格符缩排 (7)3.3.3一行一条Verilog语句 (7)3.3.4一行一个端口声明 (7)3.3.5在定义端口时,按照端口类型或端口功能定义端口顺序。

(8)3.3.6保持端口顺序一致。

(8)3.3.7声明内部net (8)3.3.8在一个段内声明所有内部net (8)3.3.9每行长度不超过80字符....................... 错误!未定义书签。

3.3.10代码流中不同结构之间用一空行隔开 (8)3.4模块划分和重用 (10)3.4.1不能访问模块外部的net和variable (10)3.4.2不使用`include编译指令 (10)3.4.3建议模块的端口信号尽可能少。

(10)3.4.4时钟产生电路单独构成一个模块 (10)3.4.5划分时钟域 (10)3.4.6物理和逻辑边界的匹配 (10)3.4.7特定应用代码要单独划分出来 (10)3.4.8关键时序逻辑划分 (10)3.4.9数据流逻辑划分 (11)3.4.10异步逻辑划分 (11)3.4.11状态机划分 (11)3.4.12控制逻辑和存储器划分 (11)3.5逻辑设计经验 (11)3.5.1时钟域要尽可能少,所用时钟尽可能加全局BUFF (11)3.5.2异步接口信号同步化 (11)3.5.3避免寄存器的数据与时钟异步 (11)3.5.4使用无毛刺的门控时钟使能信号 (11)3.5.5直接作用信号无毛刺 (11)3.5.6初始化控制存储元件 (12)3.5.7使用同步设计 (12)3.5.8避免组合反馈环 (12)3.6常用编程技巧 (12)3.6.1条件表达式的值必须是一个单bit值 (12)3.6.2总线位顺序按高到低保持一致 (12)3.6.3不要给信号赋x值 (12)3.6.4寄存器变量只能在一个always语句中赋值 (12)3.6.5对常量使用参数而不使用文本宏 (12)3.6.6不能重复定义参数 (12)3.6.7不能重复定义文本宏 (12)3.6.8保持常量之间的联系 (12)3.6.9状态编码的参数使用 (13)3.6.10`define、`undef配合使用 (13)3.6.11用基地址+地址偏移量生成地址 (13)3.6.12使用文本宏表示寄存器字段位置和值 (13)3.6.13`ifdef的嵌套限制在三层以内 (13)3.6.14操作数的位宽必须匹配 (13)3.6.15模块调用时端口要显式引用 (14)3.6.16矢量端口和net/variable声明的位宽要匹配 (14)3.6.17避免inout类型的端口 (14)3.6.18在复杂的表达式中使用括号 (14)3.7常用综合标准 (14)3.7.1always 的敏感列表要完整 (14)3.7.2一个 always 的敏感列表中只能有一个时钟 (14)3.7.3只使用可综合的结构 (15)3.7.4组合逻辑的条件需完备 (15)3.7.5循环结构中禁用disable语句 (15)3.7.6避免无界循环 (15)3.7.7端口连接禁用表达式 (15)3.7.8禁用Verilog primitive (15)3.7.9边沿敏感结构中使用非阻塞赋值(<=) (15)3.7.10Latch使用非阻塞赋值 (15)3.7.11模块闲置的输入端不要悬空 (15)3.7.12连接模块闲置的输出端 (16)3.7.13函数中不要使用锁存器 (16)3.7.14禁用casex (16)3.7.15多周期路径的信号使用单周期使能信号 (16)3.7.16三态元件建模 (16)3.7.17避免顶层胶合逻辑 (16)3.7.18在case语句中使用default赋值语句 (16)3.7.19full_case综合命令的使用 (16)附录1 HDL编译器不支持的Verilog结构 (18)附录2 Verilog和VHDL关键词列表 (19)前言编写本标准的目的是为了统一部门内部FPGA\EPLD设计用verilog语言编程风格,提高Verilog设计源代码的可读性、可靠性和可重用性,减少维护成本,最终提高产品生产力;并且以此作为代码走查的标准。

verilog编程规范

verilog编程规范

例如:
data_bus data_width clk48M 48M_clk
数据总线 使用有意义的名 字,以利于望文 数据位宽 生义 48M时钟信号 名称不能以数字开头 不能连续使用下划线 不能包含非字母符号*
data__bus
data*bus
版板所有 © 广州周立功单片机发展有限公司 2007
大小写则
底纹使用-10%灰底,必须以“程序清单”为题注并置于程
序上方。
版板所有 © 广州周立功单片机发展有限公司 2007
命名规则 注释 代码格式
版板所有 © 广州周立功单片机发展有限公司 2007
端口的申明及注释
必须明确地表明端口类型,每行中只有一个端口申明。
module buzzer (
clk_48M, beep, key, ledout ); input input output output . . . endmodule [3:0] [7:0] //时钟输入 //蜂鸣器控制输出 //按键输入 //LED显示控制信号 clk_48M; key; beep; ledout; 最好在同一行上,每 个端口列表后面紧跟 一个描述性的注释
版板所有 © 广州周立功单片机发展有限公司 2007
多个后缀的信号名的优先权
对于包含多个后缀的信号,建议采用下面的优先权, 从高到低。 最高的优先权建议从信号名的最后一个后缀 获得,多个后缀的信号名的优先权: 1. _n //低电平有效信号
ram _z data1 2.
3. 4. _clk _next
模块标号小写
//时钟 //LED输出 //48M系统时钟 //LED输出控制 //计数器 //LED输出缓存区
input output reg reg wire

第2章 Verilog语法的基本语法

第2章 Verilog语法的基本语法

例[2.1.4]: module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); // 调 用 由 mytri 模 块 定 义 的 实 例 元 件 tri_inst endmodule module mytri(out,in,enable); output out; input in, enable; assign out = enable? in : 'bz; endmodule
Verilog HDL的构造性语句可以精确地建立信号的模 型。这是因为在Verilog HDL中,提供了延迟和输出强 度的原语来建立精确程度很高的信号模型。信号值可以 有不同的的强度,可以通过设定宽范围的模糊值来降低 不确定条件的影响。 Verilog HDL作为一种高级的硬件描述编程语言,有 着类似C语言的风格。其中有许多语句如:if语句、 case语句等和C语言中的对应语句十分相似。如果读者 已经掌握C语言编程的基础,那么学习 Verilog HDL并 不困难,我们只要对Verilog HDL某些语句的特殊方面 着重理解,并加强上机练习就能很好地掌握它,利用它 的强大功能来设计复杂的数字逻辑电路。下面我们将从 Verilog HDL中的基本组成单元“ 模块”开始对 verilog的基本结构和语法逐一加以介绍。
3).用“always”块 如:always @(posedge clk or posedge clr) begin if(clr) q <= 0; else if(en) q <= d; end 采用“assign”语句是描述组合逻辑最常用的方法之一。 而“always”块既可用于描述组合逻辑也可描述时序逻辑。 上面的例子用“always”块生成了一个带有异步清除端的D 触发器。“always”块可用很多种描述手段来表达逻辑, 例如上例中就用了if...else语句来表达逻辑关系。如按 一定的风格来编写“always”块,可以通过综合工具把源 代码自动综合成用门级结构表示的组合语言结构实现设计模块 的外部性能的模型。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

注意integer和reg 类型在算术运算 时的差别。integer 是有符号数,而 reg是无符号数。
wire和tri类型有相同的功能。用户可根据需要将线网定义 为wire或tri以提高可读性。例如,可以用tri类型表示一个 net有多个驱动源。或者将一个net声明为tri以指示这个 net可以是高阻态Z(hign-impedance)。可推广至wand 和triand、wor和trior
wand、wor有线逻辑功能;与wire的区别见上页的表。
DUT u1 (y, a, b) ;
wire Y, A, B;
initial begin
and (Y, A, B) ;
a = 0; b = 0;
endmodule
#5 a = 1;
end
在过程块中只能给 register类型赋值
endmodule
信号类型确定方法总结如下:
• 信号可以分为端口信号和内部信号。出现在端口列表中的 信号是端口信号,其它的信号为内部信号。
example.v
修改前:
修改后: module example(o1, o2, a, b, c, d);
module example(o1, o2, a, b, c, d);
input a, b, c, d;
input a, b, c, d;
output o1, o2;
output o1, o2;
若未注明位宽,仅标注进制,则宽度对应数的 位数。‘O466=9’O466
整数可以在其前面加正负号,但不能放在进制 内。
如果定义的位宽比实际要短,则多余位从高位 截;若定义的位宽比实际要长,则从高位补0, 若最高位是X或Z,则高位补X或Z。
判断对错
(1) 168 =32’h0000_00A8 √
(2) -5
=32’hFFFFFFFB √
(3) ‘H78
=8’H78 √
(4) 7’D-30
(5) 5’B11 =5’B00011 √
(6) 5’BX101 =5’BXX101 √
(7) 5’BZZXX1 √
9.1 文字规则
2. 实数
Verilog 语言可以将实数转换为整数,通过四舍五 入的方法转换为最接近的整数。
Verilog根据表达式中变量的长度对表达式的值 自动地进行调整。
Verilog自动截断或扩展赋值语句中右边的值以 适应左边变量的长度。
当一个负数赋值给无符号变量如reg时,
Verilog自动完成二进制补码计算
module sign_size;
reg [3:0] a, b;
reg [15:0] c;
(2)必须以英文字母或下划线开头。 (3) 必须是单下划线,且其前后都必须是英文
字母或数字。
9.1 文字规则
(4)标识符中英文字母区分大小写。 (5)允许包含图形符号(如回车符、换行
符等),也允许包含空格。
9.1 文字规则
判断正误
5. 关键词 :是Verilog语言中已经定义的一系 列标识符的保留字
9.2 数 据 类 型
Verilog的数据类型及逻辑系统
学习内容:
学习Verilog逻辑值系统 学习Verilog中不同类的数据类型 理解每种数据类型的用途及用法 数据类型说明的语法
Verilog采用的四值逻辑系统
’0’, Low, False, Logic Low, Ground,VSS, Negative Assertion
==
等于
!=
不等于
===
全等
!==
不全等
6.缩位运算符(Reduction operators)
&

~&
与非
|

~|
或非
^
异或
^~,~^
同或
7.移位运算符(shift operators)
>>
右移
<<
左移
8.条件运算符(conditional operators)
?: 三目运算符,其定义方式如下:
信号=条件?表达式1:表达式2; 当条件成立时,信号取表达式1的值,反之 取表达式2的值。
9.位拼接运算符(concatenation operators)
{}
该运算符将两个或多个信号的某些位拼接起来。 使用如下:
{信号1的某几位,信号2的某几位,……,信 号n的某几位}
Verilog中的大小(size)与符号
寄存器型声明
<reg_type> [range] <reg_name>[, reg_name];
Verilog中net和register声明语法
举例:
reg a; //一个标量寄存器 wand w; // 一个标量wand类型net reg [3: 0] v; // 从MSB到LSB的4位寄存器向量 reg [7: 0] m, n; // 两个8位寄存器 tri [15: 0] busa; // 16位三态总线 wire [0: 31] w1, w2; // 两个32位wire,MSB为bit0
trireg类型很象wire类型,但trireg类型在没有驱动时保持 以前的值。这个值的强度随时间减弱。
寄存器类 (register)
寄存器类型在赋新值以前保持原值
寄存器类型大量应用于行为模型描述及激励描述。在 下面的例子中,reg_a、reg_b、reg_sel用于施加激 励给2:1多路器。
主要数据类型
Verilog主要有三类(class)数据类型: net (线网) : 表示器件之间的物理连接 register (寄存器) :表示抽象存储元件 parameters(参数) : 运行时的常数(run-time onstants)
net(线网)
net需要被持续的驱动,驱动它的可以是门和模块。 当net驱动器的值发生变化时, Verilog自动的将新值传送到net上。
位运算,即将两个操作数按对应位分别进行逻 辑运算。
~
按位取反
&
按位与
|
按位或
^
按位异或
^~,~^ 按位同或(符号^~与~^是等价的)
4.关系运算符(Relational operators)
<
小于
<=
小于或等于
>
大于
>=
大于或等于
5.等式运算符(Equality Operators)
第9章 Verilog语言规则
9.1 文字规则
常量(或常数)
整数类型(integer)(32位):可以被综合。 实数类型(real)(32位) 不可综合 字符串类型(strings)
9.1 文字规则
1. 整数
注意:
为了增加可读性,在较长的数间可用下划线分 开。
若不注明位宽和进制,或仅用D注明进制时, 都是十进制。如:123,’D12
将实例的输出连接到声明为register类型的信号上。 信息:<name> has illegal output port
specification. 将模块的输入信号声明为register类型。
信息:incompatible declaration, <signal name> ……
选择数据类型时常犯的错误举例
功能
标准内部连接线(缺省) 电源和地 多驱动源线或 多驱动源线与 能保存电荷的net 无驱动时上拉/下拉
没有声明的net的缺省类型为 1 位(标量)wire类型。 但这个缺省类型可由下面的编译指导改变:
`default_nettype <nettype>
net类的类型(线网)
wire类型是最常用的类型,只有连接功能。
3. 字符串(文字字符串和数位字符串) (1)文字字符串:用双引号括起来的一串
文字,一个字符串不能分成多行书写。 其宽度 为字符串中字符的个数乘以8.
(2)数位字符串也称位矢量,与文字字符串相 似,但所代表的是二进制、八进制或十六进制 的数组。
9.1 文字规则
4. 标识符
(1)有效的字符:英文字母,数字,下划线或 $或它们的组合,最长可以包含1023个字符。
用行为描述结构给寄存器类型赋值。给reg类型赋值是 在过程块中。
寄存器类的类型
寄存器类有四种数据类型
寄存器类型
功能
reg
integer
real time realtime
可定义的无符号整数变量,可以是标量(1位)或矢 量,是最常用的寄存器类型 32位有符号整数变量,算术操作产生二进制补码
形式的结果。通常用作不会由硬件实现的的数据处理。
‘1’, High, True, Logic High, Power, VDD, VCC, Positive Assertion
’X’ Unknown: Occurs at Logical Which Cannot be Resolved Conflict
HiZ, High Impedance, Tri- Stated, Disabled Driver (Unknown)
// reg c, d;
reg c, d;
// reg o2
reg o2
reg o1;
and u1(o2, c, d);
and u1(o2, c, d);
always @(a or b)
always @(a or b)
if (a) o1 = b; else o1 = 0;
if (a) o1 = b; else o1 = 0;
选择正确的数据类型
输出端口可以由 net/register驱动,但 输入端口只能是net
相关文档
最新文档