个人 FPGA 学习历程(16)—— 区分可综合和不可综合的 Verilog 语法

Verilog语言的可综合语法与不可综合语法

Verilog HDL 大体能够分为一下几个标准:Verilog-95,Verilog-2001 和 SystemVerilog。随着标准版本的升级,新版本中的关键字愈来愈多,然而增长的关键字主要是验证这个方向的。Verilog 标准实际包括了两个部分,逻辑综合和验证,而综合有时验证的一个子集。以计数器做为一个简单的例子来阐述验证与综合:编辑器

下面是一个计数器,4 位计数器,编写代码推荐是微软的 Visual Studio Code,也能够是如何支持语法高亮的编辑器,不要用 Modelsim 自带的编辑器,由于真的是十分难用啊😔:学习

“ q + 1;”这一句的综合结果以下:测试

能够看到 q + 1 被综合成了一个 4 位的组合逻辑加法器,在加法器的右侧 OUT[3:0] 老是等于 A[3:0] + 1'b1 ( 图中的B[3:0] 是个参数 4'h1)设计

第二部分,always 语句和 q <= q + 1 即 q 锁存 q + 1 的值,RTL 图以下:3d

能够看到 q[0]~reg[3..0] 这个 4 位触发器生成如下逻辑,触发器的 D 端口等于前面的 OUT[3:0],每当时钟的上升沿触发器的 Q端锁存并输出 OUT[3:0], 触发器工做还有两个前提:一是使能信号 en 为高电平,二是复位信号 rst_n 为 高电平。code

完整的 RTL 图以下:blog

它基本的知足了咱们的需求,当 复位信号 rst_n 为低电平有效时,q 输出 4'h0,其余状况下若是 en = 0,q 永远是上一次锁存 OUT[3:0],有且仅有 en = 1并且 clk 处于上升沿,触发器就会触发,锁存当前时间的 OUT[3:0]。it

这个电路存在一个小问题,若是 clk 的上升沿到来同时 en 为高电平,同时 复位信号有效,那么输出究竟是新的 OUT[3:0] 仍是 4'h0,这种状况叫作竞争条件。硬件不一样于软件,硬件是并行执行的门电路,软件是顺序执行的。在高速信号设计中竞争必须考虑并且当心的处理,这里再也不深究。因此叫作基本知足需求(⊙﹏⊙)

首先准备好文件,以下:io

这里单独使用 Modelsim,再也不使用 Quartus 来调用 Modelsim,第一步是新建一个 Modelsim 工程,以下:编译

接下来咱们编写测试脚本,用仿真来验证咱们的设计,下面是一段简单的仿真代码,也叫测试平台:

这个文件命名为 cnt4bit_test.vt,vt 是测试脚本的后缀,一样放在刚才的 modelsim 工程目录下,按以下步骤添加项目到工程中:

编译工程,Modelsim 实际上将 verilog 和 verilog testbench 编译为 x86 汇编在 PC 机上运行,速度也十分的快。

仿真结果以下:

总结一下:Verilog 语法包含不少验证关键字,好比 #20、initial、forever 等等等等。不可综合的语法被发明出来是帮助解决验证上一些的问题,虽然用起来十分的方便可是却并非真正可用的电路结构。虽然仿真器会给出理想的波形,可是具体到 Quartus 的综合器处理方式就是彻底会无视任何的 #20 之类的语法。在硬件综合器里,这两个电路彻底同样:

综合结果:

总之不要试图使用软件思惟来学习 Verilog,更不能把不能综合的语法误认为一种更方便建模技巧。。。嗯~ o( ̄▽ ̄)o