抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

高质量verilog设计

可综合语句

  • always
  • if-else
  • case
  • assign

if语句

if语句if-else​语句映射为多路选择器

不同的if-else​结构会导致不同的电路结构,根据约束不同,设计:先加法器后选择器;先选择器后加法器

加法器的面积比选择器大,但是先加法器后选择器的延时小。

if-else

单独的if-else​语句没有优先级,会逐一检查,多个if​语句之间具有优先级,多个选择器之间级联,最后一级具有最高优先级。

多if语句

若某些设计中,有些信号要求先到达(如关键使能信号、选择信号等),而有些信号需要后到达(如慢速信号、有效时间较长的信号等),此时侧需要使用if…if…结构。
设计方法:最高优先级给最迟到达的关键信号

case语句

case​和单if​语句类似,但是case​语句互斥

case​的使用注意点:

  1. 要在always​块里使用,如果是用always​块描述组合逻辑,注意括号里的敏感变量列表都是电平触发,并且赋值时都要用阻塞赋值“=”:
  2. always​块里的变量必须声明成reg类型,当然声明成reg​类型不代表一定会综合成寄存器,只是语法要求always​块里要这样;
  3. always​:块描述组合逻辑时,用*​可以代表所有always​块内敏感信号;
  4. 分支条件要写全,最好补齐default​缺省条件,不然在组合逻辑中可能会由于条件不全导致出现锁存器Latch​;

Latch语句

综合工具很难解释Latch

  • latch​由电平触发,非同步控制。在使能信号有效时latch​相当于通路,在使能信号无效时latch​保持输出状态。DFF​由时钟沿触发同步制。
  • latch​容易产生毛刺,DFF​则不易产生毛刺。
  • latch​将静态时序分析变得极为复杂。

Latch​容易在不完备的if-else​和case​中产生

  1. 使用完备if-else​语句

  2. 使用default​覆盖case​语句

  3. 查看综合工具的warning​信息

  4. 使用full_case​,告诉综合工具case​已经完备

    full_case

  5. 使用parallel_case​,告诉综合工具,所有条件互斥且并行,没有优先权

    parallel_case

资源重复利用

负载均衡、逻辑复制

负载均衡、逻辑复制

资源共享、减小面积

资源共享、减小面积

顺序重排、降低延时

顺序重排、降低延时

赋值语句

关于assign​:

  • 仅用于信号连接
  • 难以阅读,且多层嵌套后很难被综合器解释

可综合风格

always​敏感信号表

  • 所有的组合逻辑或锁存的always​结构必须有敏感信号列表。这个敏感信号列表必须包含所有的输入信号。
  • 综合过程将产生一个取决于除敏感列表中所有其它值的结构,它将可能在行为仿真和门级仿真间产生潜在的失配。
  • 在综合过程中,每个Verilog always​敏感信号列表只能对应一个时钟。
  • 这是将每一个过程限制在单一寄存器类型的要求。

wait​和delay​不能用于可综合RTL​设计

  • 原因:从RTL​级转换到gate​级的综合工具一般都不支持Wait​声明和#delay​声明,为了有效的综合,这些语句应该避免。
  • 例外:在不需要行综合的行为模块中,如测试模块Testbench​、表示行为的虚拟器件模块中可以使用。

非阻塞赋值和阻塞赋值

  • 在时序电路中必须使用非阻塞赋值<=
  • 组合逻辑电路必须使用阻塞赋值=

异步逻辑和同步逻辑

  • 建议分开异步逻辑与同步逻辑
  • 避免综合时的问题,简化约束和编码难度。
  • 不可应用于非综合模块中(例如:总线模块,总线监视器或是模拟模块)除非他们被设计来综合仿真。

控制逻辑和存储器

  • 建议控制逻辑和存储器逻辑分成独立的模块
  • 便于高层的存储器模块的使用和便于重新描述为不同的存储器类型

优秀的设计

  • 牢记并理解可综合“四大法宝”所对应的硬件结构
  • 写前确认电路指标是什么:性能?面积?
  • 硬件思维方式,代码不再是一行行的代码而是一块一块的硬件模块
  • 对所需实现的硬件电路“胸有成竹”,有足够的数电基础

降低延时

尽可能将延时高的模块放在后面

RTL编码面积

减小设计面积:

  • 成本降低、功耗降低
  • 特别是对于FPGA​的设计,直接决着FPGA​的选型
  • 估计设计使用资源的数量,知道设计中哪些部分占用了较大的面积

触发器的数量有功能决定,很难减少,面积则很好估计

组合逻辑—》RTL​代码—》各种操作符

必须使用复杂运算符,需要考虑能否使用资源共享。

多比特操作,应该看一看这个信号的所有比特是否都需要参与操作,如果不是则可以只对需要的部分比特进行操作。

多比特操作

addr<=addr+32;​—》addr[7:5]<=addr[7:5]+1;addr[4:0]<=addr[4:0]+0;

RTL编码功耗

$$
p_d=∑afCV^2
$$

pd是电路割点功耗总和,a是该点电路翻转次数,f是电路工作频率,C是该点电容,V表示电压值

RTL​无法改变负载电容、工作电压,只能考虑尽可能降低电路翻转频率

主要措施:

  • 门控时钟
  • 增加使能信号,使得部分电路只有在需要工作时才工作;
  • 对芯片各个模块进行控制,在需要工作时才工作;
  • 除了有用信号和时钟的翻转会消耗功耗组合逻辑产生的毛刺也会大量消耗功耗。
    但是,毛刺在设计中无法避免,因此,只有尽量减少毛刺在电路中的传播,才可以减少功耗。
    即,在设计中,尽量把产生毛刺的电路放在传播路径的最后。另外,可以使用一些减少毛刺的技术。

RTL编码布线

  • 但即使使用最好的布局工具,还是可能出现无法布通的情况。
  • 如果可以在RTL​编码阶段考虑代码可能对布线产生的影响就可能避免最后出现无法布通的情况

RTL设计指导原则

指导原则:

  1. 面积与速度互换
  2. 乒乓操作
  3. 流水线设计