当前位置:   article > 正文

VerilogHDL可综合描述_verilog可综合

verilog可综合

一、VerilogHDL可综合概述

1.VerilogHDL基本功能之一是描述可综合的硬件电路。

  • HDL:Hardware Description Language,硬件描述语言。

  • HDL语言具备以下硬件设计的基本概念:

    • 互连(connectivity):wire型变量描述各个模块之间的端口与网线连接关系。

    • 并发(concurrency):可以有效地描述并行的硬件系统。

    • 时间(time):定义了绝对和相对的时间度量,可综合操作符具有物理延迟。

  • 软件语言并无上述硬件对象。

2.硬件描述语言描述的电路,最终将通过逻辑综合工具、布局布线工具实现为芯片。

  • 通常,只有四个关键字能够被综合为电路:always、if-else、case、assign

  • 除此以外,其他关键字都不可以被综合为硬件电路,比如:function、for、fork、join。这些不可综合的关键字用于书写testbench。

二、常见可综合语法与硬件的映射关系

1.if-else

  • 通常会被逻辑综合映射为具有优先级的多路选择器。

  • 每个if else语句就是一个2选1选择器。

  • 设计方法:根据设计目标(面积和延迟)进行设计:先“加”后“选”,先“选”后“加”

先加后选:控制通道延时较小。

数据通道延时:一个加法器和一个选择器。

控制通道延时:一个选择器。

电路面积:两个加法器+一个选择器。

在这里插入图片描述

先选后加:减少了一个加法器,减小了硬件的面积(加法器结构复杂,使用晶体管较多)。

数据通道延时:一个加法器和一个选择器。

控制通道延时:一个选择器和一个加法器。

电路面积:两个选择器+一个加法器

在这里插入图片描述

2.单if语句

第一级选择信号具有最高的优先级。在设计中尽量使用单if语句(if…else if…else…)描述多条件判断结构,更简单,不易出错。

module Mux(
input           [2:0]   sel,
input                   a,b,c,
output  reg             f
    );
always@(*)begin
    if(sel[0])
        f = a;
    else if(sel[1])
        f = b;
    else if(sel[2])
        f = c;
    else
        f = 0;//所有条件不符时f=0,不生成锁存器
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

3.多if语句(if if if)

最后一级选择信号具有最高优先级。

module Mux(
input           [2:0]   sel,
output  reg             f
    );
reg a,b,c;
always@(*)begin
    f = 0;//所有条件不符时f=0,不生成锁存器
    if(sel[0])
        f = a;
    if(sel[1])
        f = b;
    if(sel[2])
        f = c;
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

多if语句末尾不可加else,否则最后一个条件不满足时,无论其他的条件是否满足,结果会被else的结果覆盖。

若某些设计中,有些信号要求先到达(如关键便能信号、选择信号等),而有些信号需要后到达(如慢速信号、有效时间较长的信号等)。

设计方法:最高优先级给最迟到达的关键信号。

4.case语句

通常被映射为多路选择器,当条件互斥时是一种无优先级的判断结构。

与单if语句的区别是,case的条件一般互斥,但case的条件选项并不要求互斥。

//条件互斥的四选一数据选择器
module Selector(
input           [1:0]   sel,
input                   a,b,c,d,
output  reg             f
    );
always@(*)begin
    case (sel)
        2'b00: f = a;
        2'b01: f = b;
        2'b10: f = c;
        2'b11: f = d;
        default: f = 0;
    endcase
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

case语句的条件选项不要求互斥,虽然条件选项并发比较,但执行效果为谁在前且条件为真谁被执行,当条件不互斥时则存在优先级,效果如下。

//条件不互斥的数据选择器
module Selector(
input           [1:0]   sel,
input                   a,b,c,d,
output  reg             f
    );
always@(*)begin
    case (sel)
        2'b00: f = a;
        2'b01: f = b;
        2'b01: f = c;//条件不互斥,且条件不完备
        2'b11: f = d;
        default: f = 0;
    endcase
end
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

三、电路设计需要注意的基本事项

1.慎用latch

逻辑综合工具很难解释latch,因此,除非特殊用途,一般避免引入latch。

**锁存器(latch)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/990144
推荐阅读
相关标签