1、-verilog 语法学习心得1.数字电路基础知识: 布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计2.数字系统的构成: 传感器 AD 数字处理器 DA 执行部件3.程序通在硬件上的执行过程:C 语言(经过编译)该处理器的机器语言(放入存储器)按时钟的节拍,逐条取出指令、分析指令、执行指令4.DSP 处理是个广泛概念,统指在数字系统中做的变换(DFT)、滤波、编码解码、加密解密、压缩解压等处理5.数字处理器包括两部分:高速数据通道接口逻辑、高速算法电路逻辑6.当前,IC 产业包括 IC 制造和 IC 设计两部分,IC 设计技术发展速度高于 IC 设计
2、7.FPGA 设计的前续课程:数值分析、DSP、C 语言、算法与数据结构、数字电路、HDL 语言 计算机微体系结构8.数字处理器处理性能的提高:软件算法的优化、微体系结构的优化9.数字系统的实现方式:编写 C 程序,然后用编译工具得到通用微处理器的机器指令代码,在通用微处理器上运行(如 8051/ARM/PENTUIM)专用 DSP 硬件处理器用 FPGA 硬件逻辑实现算法,但性能不如 ASIC用 ASIC 实现,经费充足、大批量的情况下使用,因为投片成本高、周期长10.FPGA 设计方法: IP 核重用、并行设计、层次化模块化设计、top-down 思想FPGA 设计分工:前端逻辑设计、后端
3、电路实现、仿真验证11.matlab 的应用:matlab 中有许多现成的数学函数可以利用,节省了复杂函数的编写时间matlab 可以与 C 程序接口做算法仿真和验证时能很快生成有用的数据文件和表格DSP builder 可以直接将 simulink 模型转换成 HDL 代码,跳过了中间的 C 语言改写步骤12.常规从算法到硬件电路的开发过程:算法的开发C 语言的功能描述并行结构的 C 语言改写verilog 的改写仿真、验证、修正综合、布局布线、投入实用13.C 语言改写成 verilog 代码的困难点:并行 C 语言的改写,因为 C 本身是顺序执行,而不是并行执行不使用 C 语言中的复杂数
4、据结构,如指针目前有将 C 语言转换成 verilog 的工具?14.HDLHDL 描述方法是从电路图描述方法演化来的,相比来说更容易修改符合 IEEE 标准的有 verilog HDL 和 VHDLVHDL 由美国国防部开发,有 1987 和 1993 两个版本verilog 由 cadence 持有,有 1995、2001、2005 三个版本verilog 较 VHDL 更有前景:具有模拟电路描述能力、不仅可以开发电路还可以验证电路、门级以下描述比 VHDL 强RTL 级和门级的综合已经成熟,主要是注意行为级的综合结果,使用可综合的编程风格SYSTEM VERILOG 是 VERILOG
5、的一种延伸15.IP 核的应用:软核 soft core: 功能经过验证的、可综合的、实现后门数在 5K 以上的 HDL 代码固核 firm core: 功能经过验证的、可综合的、实现后门数在 5K 以上的电路结构编码文件,如 edif,不可更改硬核 hard core: 功能经过验证的、可综合的、实现后门数在 5K 以上的电路结构版图,已带工艺参数,不可更改16.HDL 语言综合后得到 EDIF,这是一种标准电路网表EDIF 经过具体工艺库匹配、布局布线、延时计算后得到网表EDIF 不可更改,作为固核存在17.verilog 特点:区分大小写,所有关键字都要求小写不是强类型语言,不同类型数据
6、之间可以赋值和运算/是单行注释 可以跨行注释描述风格有系统级描述、行为级描述、RTL 级描述、门级描述,其中 RTL 级和门级别与具体电路结构有关,行为级描述要遵守可综合原则门级描述使用门级模型或者用户自定义模型 UDP 来代替具体基本元件,在 IDE 中针对不同 FPGA 器件已经有对应的基本元件原语18.verlog 语法要点:module endmodule 之间由两部分构成:接口描述和逻辑功能描述IO 端口种类: input output inout相同位宽的输入输出信号可以一起声明, input3:0 a,b; 不同位宽的必须分开写内部信号为 reg 类型,内部信号信号的状态: 0
7、1 x z, 3bx1=3bxx1 x/z会往左扩展 3b1=3b001 数字不往左扩展逻辑功能描述中常用 assign 描述组合逻辑电路,always 既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能always 之间、assign 之间、实例引用之间以及它们之间都是并行执行,always 内部是顺序执行常量格式: :默认进制为 10 进制默认位宽为 32 位位宽是从二进制宽度角度而言的由位宽决定从低位截取二进制数 2hFF=2b11,通常由被赋值的 reg 变量位宽决定parameter 常用于定义延迟和变量位宽,可用常量或常量表达式定义变量种类: wire
8、reg memoryIO 信号默认为 wire 类型,除非指定为 reg 类型wire 可以用作任何输入输出端口wire 包括 input output inoutwire 不带寄存功能assign 赋值语句中,被赋值的信号都是 wire 类型assign 之所以称为连续赋值,是因为不断检测表达式的变化reg 类型可以被赋值后再使用,而不是向 wire 一样只能输出,类似 VHDL 中的buffer 端口reg 类型变量初始值为 x (VHDL 中初始值为本类型最小值,通常是 0)always 模块里被赋值的信号都必须定义为 reg 类型,因为 always 可以反复执行,而 reg 表示信号
9、的寄存,可以保留上次执行的值reg 类型变量与 integer 变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer 是有符号数verilog 中所有内部信号都是静态变量,因为它们的值都在 reg 中存储起来了memory 型只有一维数组,由 reg 型变量组成memory 初始化只能按地址赋值,不能一次性赋值1*256 的 memory 写法: reg mema255:0 mema3=0;不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取Aa:b 无论 a b 谁大,a 总是实际电路的信号高位,b 总是实际电路的信号低位算术运算中如果有 X 值则结果为 Xf
10、or 循环中的变量另外定义成 integer,因为它不是实际信号,有正负;reg 则以无符号数存在= 和!=只比较 0、1,遇到 z 或 x 时结果都为 x (x 在 if 中算做假条件),结果可能是 1、0、x=和!=比较更加苛刻,包括 x 和 z 的精确比较,结果可能是 0、1&的结果只有 1b1 或 1b0 两种, A&A 的结果位宽则是与 A 相同的1,0为 64h100000000,所以拼接运算中各信号一定要指定位宽移位运算左移将保留 4b1000K*(组合逻辑延迟+触发器的建立保持时间/触发时间),即时间片段要长于最大路径延迟体现了面积换速度的思想,在综合时考虑的是以面积小为主还是
11、以速度为主本质上是一种同步逻辑同步时序逻辑和异步时序逻辑:同步时序逻辑指所有寄存器组由唯一时钟触发 always(posedge clk) 或always(negedage clk)异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发 always(posedge clk or posedage reset)目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中 clk 要单独用线,而不要经过反相器等部件always (posedge ) begin .=. end 表示同步时序逻辑(同时刻赋值)不同速率数据接口的处理
12、方法(异步数据的处理方法):帧同步 FIFO 双端口RAM同步状态机:包括 moore 和 mealy 型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量)状态机的开发步骤:根据实际问题列出输入输出变量和状态数画出状态图并化简写出状态转移真值表得到逻辑表达式用 D 触发器或 JK 触发器构建电路(目前用 D 触发器多)verilog 描述时只需要得到简化的状态图就可以描述状态编码方式: 独热码 格雷码状态机主体程序有单 always 描述方式和多 always 描述方式采用 case/casez/casex 建立模型最好,因为 x 是无关态,生成的电路最简单default:
13、state=bx 与实际情况更一致,效果等同于 default: state=idle只有同步状态机才能被目前的综合for 语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和 case 语句说明所有情况有优先级的 if else 结构会消耗更多资源,建议用无优先级的 case 替代模块的复用往往比代码上修改节省的资源多PLL 的分频、倍频、移相操作会增加设计精度同步时序电路的延时:#x 通常用于仿真测试,实际硬件延时是:长延迟用计数器,小延迟用 D 触发器,此方法用来取代延迟链同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间reg 类型在 always 中不一定综合
14、成时序电路,也可能是组合逻辑电路乒乓操作与作用 异步时钟域同步问题延迟包括门延迟和线延迟组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下增减敏感信号得到的结果一样补充部分:verilog HDL 起初是作为写 testbench 而产生的verilog 有 1995 进入 IEEE 标准,为 IEEE-1364, 于 2001 年进行了扩展,为 IEEE 1364-2001;verilog AMS 可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;verilog 的标识符区分大小写,关键字使用小写;用来进行单行注释,用* *来进行跨行注释;标识符由字母、数字、下划线构成,
15、并以字母开头;关键字又叫保留字,只有小写的关键字才是保留字;信号的状态有 4 种: 0 1 x zx 和 z 在描述电路时不区分大小写,在仿真时大小写有不同意义;常量表达式中:x z 不区分大小写;进制符号 h o d b 与 H O D B 不区分大小写;十六进制中 af 不区分大小写;下划线_用于提高可读性;?在数中可以代替 z;x 和 z 的左端补位;字符和字符串都以 ASICII 码形式存在,也可以当成电路内的信号;字符串必须包含在同一行,不能分成多行书写;如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成 8 位的ASCII 值序列;可综合的信号类型:wire
16、reg memory 它们用来描述数字电路不可综合的数据类型:integer real 它们只用仿真,位于 testbench 中wire 是连线的抽象模型,不能保存数据,其值由驱动元的值决定;wire 不能用在 always 或 initial 块中;wire 的默认值为高阻 z;wire 的使用情形: 1.作为模块的输出端口 2.用连续赋值语句 assign 赋值;reg 是 1 位寄存器(触发器)的抽象模型,可以保存数据;reg 必须用在 always 或 initial 块中;reg 的默认值为 x;reg 的使用情形:1.阻塞赋值= 2.非阻塞赋值=memory 只能是一维的;mem
17、ory 只能对每个单元分别初始化,方法:1.一个一个赋值 2. 通过系统任务$readmem赋值reg3:0 fc;/一个 4 位寄存器 reg fc3:0 /4 个一位寄存器parameter 的作用:仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;关系运算符将以逻辑 1 或逻辑 0 返回比较的结果;= !=的返回值有 0 1 x 三种情况,= !=的返回值只有 0 1 两种情况;verilog 由于是描述电路的,用于位的操作较多,有: 位逻辑操作,移位操作,并置操作,归约操作;位逻辑运算的结果中,位数与原操作数一样多;归约符是在原操作数的所有位上进行操作,并产生 1 位结果;并置运算
18、可以发生在 bit 与 bit 之间 bit 与矢量之间 矢量与矢量之间用于仿真的系统任务:所有系统任务都必须在 initial 或 always 内;所有系统任务都必须以$开头;常见系统任务:显示任务($diplay 系列和$write 系列)监控任务($monitor 系列)探测任务($strobe 系列)文件打开、输入、关闭任务(&fopen &fclose &fdisplay.)读取文件任务($readmemb $readmemh)仿真结束控制任务($finish $stop)随即信号任务($random)过程块: initial 块和 always 块一个 module 内可以包含多
19、个 initial 或 always 模块;所有 initial 或 always 块在 0 时刻开始并行执行,各 initial 或 always 块内部顺序执行;initial 过程块主要是面向 testbench 的,通常不具有可综合性;always 过程块在描述电路时既可以描述组合逻辑电路(电平敏感)又可以描述时序逻辑电路(边沿敏感);写 testbench 时 initial 通常用于初始化以及顺序波形的描述,always 通常用于重复波形的描述;任务 task 与函数 function: 为了描述模块中被多次执行的部分以及为了增强代码的易读性verilog 中的高级程序语句如 fo
20、r 循环语句只用在写 testbench 中;begin end 和 fork join 是两种特殊的括号if 语句的第三种形式适合描述优先编码器,case 语句适合描述数据选择器和状态机;case 的条件表达式如果与分支项表达式长度不同,则在比较前将所有表达式都统一为这些表达式的最长长度;casez 忽略 z,casex 忽略 z 和 x;assign 语句只在右端表达式发生变化时才重新计算并重新赋值,其余时间都是连续赋值;assign 语句可以指定 bit、vector 或是任意拼接操作的结果;assign 语句是连续赋值的,用于驱动网线 wire, reg 类型不需要连续赋值,reg 类型一旦被赋值就会一直保存;过程赋值语句有两种:阻塞式=和非阻塞式=,只能在过程块 initial 和 always 中使用;对事件触发的控制与 wait 语句不能同时使用;