verilog学习心得 联系客服

发布时间 : 星期六 文章verilog学习心得更新完毕开始阅读

默认进制为10进制 默认位宽为32位

位宽是从二进制宽度角度而言的

由位宽决定从低位截取二进制数2'hFF=2'b11,通常由被赋值的reg变量位宽决定

parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义 变量种类:wire reg memory

IO信号默认为wire类型,除非指定为reg类型 wire可以用作任何输入输出端口 wire包括input output inout 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写法:reg mema[255:0] mema[3]=0;

不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取 A[a:b] 无论a b谁大,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过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突

与assign连用描述组合电路

begin end中阻塞的含义:begin ...@(A B=C...; end 如果A事件不发生则永远不能执行下去,被阻塞了由于时钟的延时(往往在ps级,多个always(posedge之间究竟谁先执行是个未知数

使用原则:同一个always过程块内建立时序电路用<= 纯组合逻辑电路用=,生成的电路结构最简单,执行速度最快 同一个always块内不要混用<=和=

不要在多个always块内对同一个变量赋值(多源驱动

if else的三种形式,第三种形式适合描述优先编码器 if条件中0/x/z当成假,1当成真,非0的数值也当成真

case语句的三种:case(四种状态的比较 casez(忽略z casex(忽略x和z,只看哪些位的信号有用 case语句中所有表达式值的位宽必须相等,default中不能将n'bx用'bx代替

避免生成锁存器的方法:电平触发时if后加else case中加default ? 使用casex会将不必要的状态视为无关项,使得综合出来的电路最简单 两种特殊的括号:begin 顺序语句... end fork 并行语句... join,其差别在于块内语句的起止时间、执行顺序、相对延时块被命名后,其内部变量可以被调用,因为变量都是静态的(调用信号:对应电路中的一个信号线被引到另一处

initial块只无条件执行一次always块在满足条件时不断执行 initial常用来写测试文件,always块常用来写电路描述 always既可以描述组合逻辑电路又可以描述时序逻辑电路 always如果后面有敏感信号列表则不能用wait语句

always既可以描述电平触发又可以描述边沿触发,wait只能描述电平触发 assign常用于描述组合逻辑电路 测试文件中一般都是现initial 后always

生成语句:生成快的本质是使用循环内的一条语句代替多条重复的verilog语句,简化了用户的编程

genvar用于声明生成变量,生成变量只能用在生成快之间