【Day14】verilog 中的可综合语句

我们都知道 verilog 是一种硬体描述语言,所以目的就是要能综合出实际的电路,但实际上在 verilog 中并不是所有语句都是可综合的,因为有些语句是用来验证(TestBench)的关键字,属於那些验证用的语句只能在验证时被使用,例如 initial、time、wait... 等等,所以在设计数位电路时,一定要特别注意电路的可综合性~~

所有综合工具都支持的语法:

always, assign, begin, end, case, wire, tri, aupply0, supply1, reg, integer, default, for, function, and, nand, or, nor, xor, xnor, buf, not, bufif0, bufif1, notif0, notif1, if, inout, input, instantitation, module, negedge, posedge, operators, output, parameter。

有些综合工具支持但有些不支持的语法:

casex, casez, wand, triand, wor, trior, real, disable, forever, arrays, memories, repeat, task, while。

所有综合工具都支持的语法:

time, defparam, $finish, fork, join, initial, delays, UDP, wait。


撰写可综合电路应该要保持的几项原则:

  • 不应该使用 initial 语句来初始化电路的信号。
    • 所有的初始化动作都应该靠 reset 或是 reset_n 来达成。
    • 写 MCU 并烧录进去後要按下 reset 键才会动作的原因也是为此,就是为了初始化电路内的各个信号。
    • 由於信号应由 reset 或 reset_n 来初始化,所以宣告 reg 时也不会先给初始值,那是没有必要的。
  • 整体电路应该为同步式设计。
    • 意思是 always 内的触发信号应当只有 clk 以及 reset 信号。
    • 由电路内自己产生的信号当作是 always 的触发是不算同步式设计的。
  • 对同一个变数不可同时使用 blocking 及 non-blocking。
    • 前几篇有提到组合逻辑用 blocking,而循序逻辑用 non-blocking,依照此原则也不会误用~
  • 不使用 UDP(User Defined Primitives)
    • 是一种允许用户自己定义的元件,通过 UDP,可以把一块组合逻辑电路或者循序逻辑电路封装在一个 UDP 内,并把这个 UDP 作为一个基本的元件来引用,但 UDP 不能综合,只能用於仿真。
  • 不该在程序内使用 delay 语句(ex: #100)。
  • 同一个变数不可由两个不同的 always 来赋值。
  • 同一个变数不应该由多个不同的 clk 来做触发。

<<:  [Day 14] 阿嬷都看得懂的 style 标签怎麽用

>>:  Day13【Web】网路攻击:DDoS 之 DNS 递回查询攻击

Day14 NodeJS-NPM I

终於进入NodeJS中最为人知的套件管理系统NPM了,不讳言的当初对NodeJS一知半解的我对於No...

Day17 X 初探快取 & HTTP Caching

今天即将进入 Caching & Networking 章节的第一天,快取,是一个非常重要...

使用Emmet省下泡一杯咖啡的时间(HTML篇)

使用Emmet省下泡一杯咖啡的时间 (HTML篇) 效率满点的好工具 为什麽而学? 前身是Zen c...

Day 29. 手机萤幕截图安全性问题,小心被看光光

今天来讲讲手机app截图安全性问题 IOS 截图是系统层级因此安全问题不大,但还是需要适时提醒使用...

[经典回顾]未知病毒入侵金融业事件纪录

防毒软件不断推陈出新,病毒也变化多端... 站在 Blueteam 位置,守住资讯安全防线的难度也飞...