Verilog 之《设计与验证VerilogHDL》- RTL级建模

1. RTL与综合

RTL级是可综合的描述, 综合(Synthesize)是指将HDL语言, 原理图等设计输入翻译成门级连接,并根据设计目标及要求优化所生成的逻辑连接,输出门级网表文件.


2. RTL级设计基本要素及步骤

  • RTL设计包含
    • 时钟域描述
      • 描述设计中使用的所有时钟 \ 时钟之间的主从及派生关系以及时钟域之间的转换
    • 时序逻辑描述 (寄存器描述)
      • 根据时钟沿的变化, 描述寄存器之间的数据传输方式
    • 组合逻辑描述
      • 描述电平敏感信号的组合方式和逻辑功能
  • RTL代码设计顺序
    • 功能定义与模块划分
      • 根据系统功能的定义和控制划分
    • 定义所有模块的接口
      • 定义每个模块接口, 完成每个模块信号列
    • 设计时钟域
      • 确认异步时钟域之间的数据交换, 确认全局时钟使用PLL的分频, 倍频等
      • 确认全局时钟资源布线, 第二全局时钟资源布线
      • 全局时钟资源特点 : 几乎没有clock skew \ clock delay \ 驱动能力最强,以此类推,逐级递减,递增
    • 考虑设计的关键路径
      • 关键路径是指设计中时序要求最难满足的路径
      • 设计的时序要求主要体现在频率, 建立时间 , 保持时间等时序指标上
    • 顶层设计
      • 自顶向下的设计方式
    • FSM设计
      • 有限状态机( FSM )是逻辑设计中最重要的内容
    • 时序逻辑设计
      • 根据时钟选好寄存器组描述传输方式
    • 组合逻辑设计
      • 组合逻辑与时序逻辑分离

3. 阻塞赋值 \ 非阻塞赋值 \ 连续赋值

  • 对于时序逻辑,即always 模块的敏感列表为沿敏感信号 (时钟或者复位的上下沿),统一使用非阻塞赋值 “<=”
  • 对于always模块的敏感列表为电平信号的组合逻辑,统一使用阻塞赋值 “=”
  • 对于assign关键字描述的组合逻辑 (通常为连续赋值语句) ,统一使用 “=” ,变量定义为 wire 型变量
    注:在后两项中使用 “=” 主要原因在于避免产生组合逻辑环, 其会导致在时序路径无法被工具分析从而使不同批次器件逻辑功能发生一定概率的错误

4. 寄存器电路建模

  • 数字逻辑电路两大基本因素 : 寄存器 和 组合逻辑 ,寄存器一般和同步时序逻辑关联,一般在时钟上下沿发生 状态改变.
    • 寄存器信号声明 : 寄存器被定义为reg型, , 但是被定义为reg 型的变量不一定是寄存器, 只有当信号被定义为reg型 且出里该信号的always 敏感列表为posedge or negedge沿敏感时才会被实现为寄存器
  • 同步复位 / 置位 : 任何寄存器都可以实现同步复位/置位, 指定同步复位/置位时,always 敏感列表中仅有时钟沿信号,当复位信号发生之后当时钟边沿采到同步复位/置位的有效电平时才会在时钟沿到达时刻进行复位
  • 异步复位 / 置位 : 无论时钟沿是否有效,当复位信号到达时立即发生复位 ,实现方式为在敏感列表中加入复位信号有效沿
  • 尽量不使用双边沿,在可使用PLL进行倍频使用

5.组合逻辑建模

  • 组合逻辑的特点在于输出的变化仅仅与输入变化有关,而与时钟沿无关, 主要分为两类 : 其一为always 模块的敏感表为电平敏感信号的电路 , 其二为assign等关键字描述的组合逻辑电路
    • always模块的敏感列表为电平信号的组合逻辑电路
      • 注意敏感列表的完整性, 尽量使用阻塞赋值 ‘=’,且reg 型不会被真正实现为寄存器
      • 不考虑代码的复杂性,几乎所有组合逻辑电路都可以实现
    • assign语句描述的组合逻辑电路
      • 适合相对简单的逻辑电路,信号定义为wire型,

6.双向端口与三态信号建模

  • 双向总线应该在顶层模块中实例化三态信号,而不能在顶层意外的其他子层次实例化三态信号.这样是为了避免仿真和综合实现结果不一致
  • 将双向总线分为输入总线和输出总线使用
module bibus (clk, rst, sel, data_bus, addr);
input       clk, rst, sel;
input [7:0] addr;
inout [7:0] data_bus;
wire [7:0] data_in, data_out;
assign data_in = data_bus;
assign data_bus = (sel) ? data_out : 8'bZ;
//sel为控制信号,sel为低时data_bus为高阻,为输入状态,反之为输出状态,


7.Mux建模

  • 简单的Mux用 "?"建模,信号定义wire型,使用 ? 表达式的判断条件描述Mux选择端的逻辑关系
  • 复杂的Mux用case或嵌套if else建模,信号定义reg型,判断分支均分别对应Mux的某路选择输出

8.存储器建模

  • 单口RAM,双口RAM及ROM型存储器, Verilog语法中最基本的存储单元定义如下:
reg [datawitch] MemoryName [addresswidth] 
reg [7:0] RAM8x86 [0:63] 数据位宽为8,地址为63位的RAM
  • 在使用存储单元时不能直接使用类似C语言访问二维数组的形式,而应该讲存储单元赋值给一个寄存器,在对寄存器进行位操作.
  • 一般不使用语法建立存储单元
    • 内嵌IP生成
    • 在没有BRAM或者DRAM等专用存储单元或者熟悉综合器类推算法,并能通多综合器的相关约束属性,指定所需使用的底层硬件RAM资源可以考虑使用语法建立存储单元

9.时钟分频电路

  • 一般使用官方IP,在图形界面直接配置PLL \ DLL参数
  • 当器件没有内嵌PLL \ DLL时钟电路及受限于资源时可以使用一些自定义电路,对时钟的处理多为分频及移相.
    • 偶数分频,高速时钟做同步计数器,在相应bit位抽头
    • 移相 通过高速时钟调整相位,或通过时钟反向调整相位
module clk_even_phase (rst, clk_200K, clk_100K, clk_50K, clk_25K);
input        clk_200K;
input        rst;
output       clk_100K, clk_50K, clk_25K;
wire         clk_100K, clk_50K, clk_25K;
reg [2:0] cnt;  
always @ (posedge clk_200K or negedge rst)
   if (!rst)
      cnt <= 3'b000;
   else
      cnt <= cnt + 1;
assign clk_100K = ~cnt [0];
assign clk_50K  = ~cnt [1];
assign clk_25K  = ~cnt [2];
endmodule
//需要调整所有时钟的相位,对计数器的每个bit进行取反,保证分频后时钟初相完全一致,与原生时钟的相位存在微小误差,误差来自寄存器固有Tco(Clock to Output)和计数器累加的组合逻辑,其值在1~2ns,

  • 奇数分频 可以使用case结构或者使用简单状态机 (FSM)描述,要着重注意如何通过组合逻辑调整分频时钟占空比
module clk_3div (clk,reset,clk_out);
 input clk, reset;
 output clk_out;
 reg[1:0] state;
 reg clk1;
   always @(posedge clk or negedge reset)
     if(!reset)
        state<=2'b00;
     else
       case(state)
         2'b00:state<=2'b01;
         2'b01:state<=2'b11;
         2'b11:state<=2'b00;
         default:state<=2'b00;
       endcase
       
 always @(negedge clk or negedge reset)
     if(!reset)
        clk1<=1'b0;
     else
        clk1<=state[0];
        
 assign clk_out=state[0]&clk1;
endmodule 


10.串并转换建模

  • 根据数据排序和数量要求,数据量较小的时候可以使用移位寄存器实现 ; 对排列顺序有规定的串并转换可以使用case语句判断实现 ; 更复杂的设计可以使用状态机,按照业务需求而定

11.同步复位和异步复位

  • 复位电路工作
    • 仿真是电路进入初始状态或预工作状态,
    • 综合实现的电路通过复位进入初始状态或预工作状态
    • 任何寄存器, 存储器, 逻辑单元等结构都必须附加复位逻辑
    • 常用复位为低电平有效, 外部引脚接上拉电阻, 以只能加复位电路的抗干扰性能
  • 同步复位电路建模
    • 当复位信号发生变化时,电路并不理复位,当有效时钟沿采样到已变化的复位信号才对所有寄存器复位
    • 一般在电路中使用 if else结构, 复位电路在第一个if下进行描述, 其他电路在else 等分支中描述
    • 优势
      • 同步复位利于周期机制的仿真器进行仿真
      • 同步复位可以设计100%的同步时序设计,有利于时序设计,其综合结果的频率一般较高
      • 同步复位仅在时钟的有效沿生效, 可以有效避免因复位电路毛刺造成的亚稳态和错误,
    • 劣势
      • 目标器件和ASIC库的触发器本身并不包含同步复位端口,使用同步复位会增加逻辑资源
      • 需要复位信号有效时间, 至少大于一个采样周期,同时要保证同步复位信号树相关逻辑路径的延迟, 以及由于时钟布线产生的偏斜.
  • 异步复位电路建模
    • 复位信号产生作用不受控于时钟采样边沿, 大多数目标器件(FPGA \ CPLD)和ASCI库触发器都包含异步复位端口, 异步复位会直接到触发器的异步复位端口
    • 优势
      • 因为器件多有异步复位端口,所以比同步复位节省复位资源2异步复位设计简单
      • 多数FGPA会有专用全局异步复位 \ 置位资源 ( GSR, Global Set Reset)使用GSR资源,异步复位到达所有寄存器的偏斜 (Skew)最小
    • 缺点
      • 异步复位的作用和释放与时钟沿无关, 当释放异步复位时与时钟有效沿到达一致就容易造成亚稳态,形成逻辑错误
      • 如果异步复位逻辑树的逻辑产生毛刺,而毛刺的有效沿会误触发触发器复位,形成逻辑错误
      • 综上 ,优先使用异步复位,同步释放
reg reset_reg;
always @ (posedge clk)
     reset_reg <= rst_;
always @ (posedge clk or negedge reset_reg)
   if (!rst_)
       	………
   else
  		……

12.case 和 if~ else~ 建模

  • case结构每个分支的条件判断和执行都是并行的, 没有优先级 ; if~ else if~ else结构同样为无优先级判断结构 ; if~ if~ if~结构为具有优先级的判断结构
  • 优先级判断结构会消耗组合逻辑单元,非必要尽量少用

本文仅为个人记录 做理解之用.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Verilog HDL是一种硬件描述语言,常用于数字电路设计设计验证Verilog HDL需要掌握以下内容: 一、Verilog HDL的语法结构 Verilog HDL的语法结构包括模块声明、端口声明、内部信号声明、组合逻辑与时序逻辑设计等内容。模块声明包括模块名称、端口声明、内部信号声明等。端口声明包括输入、输出和双向端口。内部信号声明包括整型、实数型、时钟型等类型。 二、时序逻辑设计 时序逻辑设计包括触发器、计数器、状态机等常用电路的设计方法。在Verilog HDL中,时序逻辑设计可以通过使用时钟信号实现,如边沿触发器、电平触发器等。此外,还需要设计时序电路的复位和同步等特性。 三、组合逻辑设计 组合逻辑设计包括逻辑门的设计、多路选择器、位移寄存器等常用电路的设计方法。在Verilog HDL中,可以通过逻辑运算符实现各种逻辑运算,如与、或、非、异或等。 四、仿真与验证 完成Verilog HDL设计后,需要进行仿真与验证。通过仿真可以模拟实际电路的工作情况并进行测试,以验证设计是否正确。在仿真过程中,需要构建测试台并编写测试程序,以测试电路的各种输入组合和输出情况。同时,还需对电路的时序特性进行仿真与验证,以确保电路满足设计要求。 总之,设计验证Verilog HDL需要学习Verilog HDL的语法结构、时序逻辑设计、组合逻辑设计以及仿真与验证等内容。随着实际经验的积累,设计师可以逐步提高设计水平和验证效率,不断完善电路设计验证的技能。 ### 回答2: 设计验证Verilog HDL(硬件描述语言)PDF是一种实现数字电路设计的方法。Verilog HDL广泛应用于数字集成电路(IC)的设计过程中,用于建模和仿真硬件电路逻辑。本文将探讨如何使用Verilog HDL设计验证数字电路。 首先,使用Verilog HDL设计数字电路的第一步是定义模块。模块是设计中的基本单位,它描述了电路中的组成部分,并规定了输入和输出端口。设计人员需要定义模块,包括模块名称、端口、变量、常量等。 接着,设计人员需要定义Verilog HDL语言中的结构体和运算符。结构体描述了各种数据类型,例如整数、实数、字符串等,以及它们所包含的各种属性和方法。运算符则描述了各种算术逻辑运算,包括加减乘除、位运算、逻辑运算等。 另外,设计人员需要了解如何使用仿真器对设计进行仿真。仿真是验证设计是否符合要求的重要步骤。在仿真过程中,设计人员必须创建测试台以处理模块输入和输出数据,并编写测试程序来验证模块的逻辑。仿真器还可以帮助设计人员诊断可能存在的问题。 最后,设计人员需要定义输出文件和输出格式,以便将数字电路设计转换为PDF文档。设计人员需要选择合适的输出文件格式,并设置输出参数,以便生成精准、易于共享和可读性高的PDF文档。 总的来说,Verilog HDL是一个广泛应用于数字电路设计的语言,它具有简明的语法、易于编写和易于理解的特点,同时也提供了丰富的仿真工具。对于数字电路设计人员来说,了解如何使用Verilog HDL设计验证数字电路非常重要,这将有助于提高设计效率和减少成本。 ### 回答3: Verilog HDL是一种硬件描述语言,用于描述数字系统的硬件结构和行为,是现代数字电路设计的主流工具之一。设计验证Verilog HDL PDF是一种包含设计方案和验证流程的文档,用于指导设计者完成数字电路设计设计验证Verilog HDL PDF一般包含以下几部分:首先是设计目标和需求,即需要实现的数字电路的功能和性能指标。其次是电路结构设计,包括状态机、模块设计RTL别的模块连接和I/O接口设计等。然后是时序分析,确定电路的最大工作频率和时序限制。接下来是仿真验证,该部分基于电路设计分区验证(PNR)生成的最终布局电路的仿真,用于验证电路的可行性、精度和时序需求的一致性等。最后是测试验证,用于确定数字电路在实际应用中的正确性和性能。 在设计验证Verilog HDL PDF的过程中,需要考虑到多个方面,如开发工具的选择、板卡及硬件的约束、仿真与验证方法的选择等因素。同时还需要掌握Verilog HDL语言的语法规则和设计方法,具备数字电路设计、硬件验证、测试方法及技能。 总之,设计验证Verilog HDL PDF是数字电路设计中非常重要的一环,能够指导设计者完成数字电路的设计验证过程,确保设计出性能可靠的数字电路系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值