Verilog语言可以有多种方式来描述硬件,同时,使用这些描述方式,又可以在多个抽象层次上设计硬件,这是Verilog语言的重要特征。

  在Verilog语言中,有以下3种最基本的描述方式:

  • 数据流描述:采用assign连续赋值语句
  • 行为描述:使用always语句或initial语句块中的过程赋值语句(推荐掌握)
  • 结构化描述:实例化已有的功能模块或原语

  以一个4位全加器为例:

数据流描述 行为描述 结构化描述
module Full_Add_4b_1( A, B, Cin, Sum, Cout ); 
input[3:0] A; input[3:0] B; input Cin; output[3:0] Sum; output Cout; 
 assign {Cout, Sum} = A + B + Cin; 
 endmodule
module Full_Add_4b_2( A, B, Cin, Sum, Cout );
input[3:0] A; 
input[3:0] B;
input Cin; 
output[3:0] Sum; output Cout; 
reg [3:0] Sum; 
reg Cout; 
 always @(A or B or Cin) begin {Cout, Sum} <= A + B + Cin;
 end endmodule
`include "Full_Add_4b_1.v" 
 module Full_Add_4b_3( A, B, Cin, Sum, Cout ); 
input[3:0] A; 
input[3:0] B; 
input Cin;
output[3:0] Sum; 
output Cout; //实例化全加器 Full_Add_4b_1 FA0( A, B, Cin, Sum, Cout ); 
endmodule

 

  下面逐一对这些描述方式进行介绍:

  数据流描述

  在数字电路中,信号经过组合逻辑时会类似于数据流动,即信号从输入流向输出,并不会在其中存储。当输入发生变化时,总会在一定时间以后体现在输出端。同样,我们可以模拟数字电路的这一特性,对其进行建模,这种建模方式通常被称为数据流建模。数据流描述中最基本的语句是assign连续赋值语句。

  图中的模型可以用如下语句来描述:

  asssign #1 A_xor_wire = eq0 ^ eq1;

  在任意一个时刻,A_xor_wire线网的值都是由eq0和eq1决定的,也可以说是由它们驱动的。

  下面对连续赋值语句的特点进行说明:

  一、连续驱动

  连续赋值语句是连续驱动的,也就是说只要输入发生变化,都会导致该语句的重新计算。

  二、只有线网类型的变量才能在assign语句中被赋值

  由于连续赋值语句中被赋值的变量在仿真器中不会存储其值,因此该变量是线网类型(Net)的,而不是寄存器类型的。

  另外,线网类型的变量可以被多重驱动,也就是说可以在多个连续赋值语句中驱动同一个线网。

  但是寄存器变量就不同了,它不能被不同的行为进程(例如always语句块)驱动。

  三、使用assign对组合逻辑建模

  建议使用assign对组合逻辑建模,这是因为assign语句的连续驱动特点与组合逻辑的行为非常相似,而且在assign语句中加延时可以非常精确地模拟组合逻辑的惯性延时。

  四、并行性

  assign语句与行为语句块(always和initial)、其它连续赋值语句、门级模型之间是并行的。一个连续赋值语句是一个独立的进程,进程之间是并发的,同时也是交织的。

  五、实例

  这是一个半加器,使用连续赋值语句描述这个电路

HDL代码 RTL电路
module Half_Add( X, Y, Sum, C_out ); //半加器 input X; input Y; output Sum; output C_out; assign Sum = X ^ Y, C_out = X & Y; endmodule
在Half_Add模块中,两个assign语句之间是独立并行的,它们的顺序与逻辑功能无关。

  行为描述

  行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模。在表示方面,类似数据流的建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方式。行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等。

  例: 一位全加器的行为建模

module Full_Add_1b_2( A, B, Cin, Sum, Cout ); 
input A; 
input B; 
input Cin; 
output Sum; 
output Cout; 
reg Sum;
reg Cout; 
always @(A or B or Cin) 
    begin {Cout, Sum} <= A + B + Cin; 
end endmodule

  需要先建立以下概念:

  1、只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
  2、always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
  3、always 语句从0 时刻开始。
  4、在begin 和end 之间的语句是顺序执行,属于串行语句。

  结构化描述

  结构化描述就是说在设计中实例化已有的功能模块,这些功能模块包括门原语、用户自定义原语(UDP)和其他模块(module)。以下是结构化描述的3种实例类型:

  • 实例化其他模块
  • 实例化门(如与门and、异或门xor等)
  • 实例化UDP

  结构化的描述方式反映了一个设计的层次结构。

  例[1]:一位全加器

HDL代码 RTL电路
module Full_Add_1b_3( A, B, Cin, Sum, Cout ); input A; input B; input Cin; output Sum; output Cout; wire S1, T1, T2, T3; // -- statements -- // xor x1 (S1, A, B); xor x2 (Sum, S1, Cin); and A1 (T3, A, B ); and A2 (T2, B, Cin); and A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3 ); endmodule

  该实例显示了一个全加器由两个异或门、三个与门、一个或门构成。S1、T1、T2、T3则是门与门之间的连线。代码显示了用纯结构的建模方式,其中xor 、and、or 是Verilog HDL 内置的门器件。

  以 xor x1 (S1, A, B) 该例化语句为例:

  xor 表明调用一个内置的异或门,器件名称xor ,代码实例化名x1(类似原理图输入方式)。括号内的S1,A,B 表明该器件管脚的实际连接线(信号)的名称 ,其中 A、B是输入,S1是输出。其他同。

  例[2]:两位全加器

  两位的全加器可通过调用两个一位的全加器来实现。该设计的结构图如下:

  

`include "Full_Add_1b_3.v" module Full_Add_2b_3( FA, FB, FCin, FSum, FCout ) ; parameter SIZE = 2; input [SIZE:1] FA; input [SIZE:1] FB; input FCin; output [SIZE:1] FSum; output FCout; wire FTemp; Full_Add_1b_3 FA1( .A (FA[1]), .B (FB[1]), .Cin (FCin) , .Sum (FSum[1]), .Cout (FTemp) ); Full_Add_1b_3 FA2( .A (FA[2]), .B (FB[2]), .Cin (FTemp) , .Sum (FSum[2]), .Cout (FCout) ); endmodule

  该实例用结构化建模方式进行一个两位的全加器的设计,顶层模块Full_Add_2b_3 调用了两个一位的全加器 Full_Add_1b_3。在这里,以前的设计模块Full_Add_1b_3 对顶层而言是一个现成的器件,顶层模块只要进行例化就可以了。

  注意这里的例化中,端口映射(管脚的连线)采用名字关联,如 .A (FA[2]) ,其中.A 表示调用器件的管脚A,括号中的信号表示接到该管脚A的电路中的具体信号。 wire 保留字表明信号FTemp 是属线网类型。

  另外,在设计中,尽量考虑参数化的问题

RTL级,register transfer level,指的是用寄存器这一级别的描述方式来描述电路的数据流方式;而Behavior级指的是仅仅描述电路的功能而可以采用任何verilog语法的描述方式。鉴于这个区别,RTL级描述的目标就是可综合,而行为级描述的目标就是实现特定的功能而没有可综合的限制。

行为级是RTL的上一层,行为级是最符合人类逻辑思维方式的描述角度,一般基于算法,用C/C++来描述。从行为级到RTL级的转换,一般都是由IC设计人员手工翻译。

这个过程繁琐,工作量很大,特别是随着数字系统的复杂性提升,这样的纯手工"翻译"过程容易出错,且使得开发周期变长。一批高级综合工具应运而生。如Menter Graphics的高层次综合工具Catapult C Synthesis。能够将数字系统的行为级描述映射为RTL设计,并满足给定的目标限制。从层次由上到下,数字系统的设计过程为:

Idea->行为级描述->rtl描述->门级网标->物理版图

行为级的描述更多的是采取直接赋值的形式,只能看出结果,看不出数据流的实际处理过程。其中又大量采用算术运算,延迟等一些无法综合的语句。常常只用于验证仿真。
RTL级的描述就会更详细一些,并且从寄存器的角度,把数据的处理过程表达出来。可以容易地被综合工具综合成电路的形式。

行为级描述可是说是RTL的上层描述,比RTL更抽象。行为描述不关心电路的具体结构,只关注算法。
有行为综合工具,可以直接将行为级的描述综合为RTL级的,比如Behavioral Compiler。

在硬件设计中有一句著名的话:thinking of hardware。RTL在很大程度上是对流水线原理图的描述。哪里是组合逻辑,哪里是寄存器,设计者应该了然于胸。组合逻辑到底如何实现,取决于综合器和限制条件。

rtl级可以理解为,可以直接给综合工具生成你要的网表的代码,而行为级则不行。比如real可以用于行为级,而不能用于rtl级!

行为级 is for testbench for modelling.
RTL is for synthesis

语法块如果可以被综合到gate level,就是RTL的。否则就是behavior level的。
同样是for语句,如果循环条件是常数,就是RTL的,如果是变量,就是behavior的。

行为级不考虑电路的实现,不考虑综合

RTL级描述数据在寄存器层次的流动模型。
always 属于行为级模型,是最基本的行为模型,是可以综合的。
综合与RTL或者行为级没有必然联系,虽然大多数行为模型不能综合

从网上copy
目的区别:        

      行为级描述目的是加快仿真速度,做法是尽量减少一个always块中要执行的语句数量,其结果不是为了综合,只关注算法。有行为综合工具,可以直接将行为级的描述综合为RTL级的,比如Behavioral Compiler。

形式区别:

      RTL级描述是为了综合工具能够正确的识别而编写的代码,verilog中有一个可综合的子集,不同的综合工具支持的也有所不同,    RTL级的描述就会更详细一些,并且从寄存器的角度,把数据的处理过程表达出来。可以容易地被综合工具综合成电路的形式。可以采用任何verilog语法 的描述方式。鉴于这个区别,RTL级描述的目标就是可综合,

      行为级的描述更多的是采取直接赋值的形式,只能看出结果,看不出数据流的实际处理过程。其中又大量采用算术运算,延迟等一些无法综合的语句。常常只用于验证仿真。

电路区别:

      RTL级,register transfer level,指的是用寄存器这一级别的描述方式来描述电路的数据流方式;RTL在很大程度上是对流水线原理图的描述。哪里是组合逻辑,哪里是寄存器,设计 者应该了然于胸。组合逻辑到底如何实现,取决于综合器和限制条件。 RTL是晶体管传输级,描述硬件的相互联接关系,一般都可以综合;

      而Behavior级指的是仅仅描述电路的功能而在硬件设计中有一句著名的话:thinking of hardware。简单说,rtl就是用寄存器和组合逻辑组成,不能再用其他construct;behavior就是指定输入和输出之间的关系。

混乱点:   有时感觉RTL级是行为级与数据流级的混合应用。

乐点:      同样是for语句,如果循环条件是常数,就是RTL的,如果是变量,就是behavior的。

转:https://blog.csdn.net/a8039974/article/details/43635257

Verilog的数据流、行为、结构化与RTL级描述的更多相关文章

  1. Verilog HDL的程序结构及其描述

    这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出. 一.Verilog ...

  2. [C++]深入解析结构化异常处理(SEH)

    http://www.cppblog.com/weiym/archive/2015/02/27/209884.html 尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的 ...

  3. Spark SQL - 对大规模的结构化数据进行批处理和流式处理

    Spark SQL - 对大规模的结构化数据进行批处理和流式处理 大体翻译自:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/con ...

  4. 行为级和RTL级的区别(转)

    转自:http://hi.baidu.com/renmeman/item/5bd83496e3fc816bf14215db RTL级,registertransferlevel,指的是用寄存器这一级别 ...

  5. DataPipeline丨瓜子二手车基于Kafka的结构化数据流

    文 |彭超 瓜子大数据架构师 交流微信 | datapipeline2018 一.为什么选择Kafka   为什么选Kafka?鉴于庞大的数据量,需要将其做成分布式,这时需要将Q里面的数据分到许多机器 ...

  6. 深入研究 Win32 结构化异常处理(好多相关文章)

    摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...

  7. 深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)

    摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...

  8. Structured Streaming Programming Guide结构化流编程指南

    目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...

  9. [AI开发]基于DeepStream的视频结构化解决方案

    视频结构化的定义 利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据.相比数据库中每条结构化数据记录,视频.图片.音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些 ...

随机推荐

  1. Python之pytesseract模块-实现OCR

    在给PC端应用做自动化测试时,某些情况下无法定位界面上的控件,但我们又想获得界面上的文字,则可以通过截图后从图片上去获取该文字信息.那么,Python中有没有对应的工具来实现OCR呢?答案是有的,它叫 ...

  2. 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载

    转载===方便以后复习 原文网址:https://www.jianshu.com/p/dee9f8b14771 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为 ...

  3. 动环监控系统中B接口的实现

    动环监控系统简述 1.术语介绍 1.1 省集中监控中心-Province Supervision Center(PSC) 面向多FSU管理的高级监控层次,即省集中监控中心,通过开放的数据协议,连接监控 ...

  4. Python - 面向对象编程 - 实战(5)

    前言 主要是针对静态方法.类方法.实例方法.类属性.实例属性的混合实战 需求 设计一个 Game 类 属性 定义一个类属性 top_score 记录游戏的历史最高分,这个属性很明显只跟游戏有关,跟实例 ...

  5. mac、ip、udp头解析

    一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6];    // ...

  6. 史上最详细的信号使用说明(已被收藏和N次)

    Unix环境高级编程(第三版) 第10章 信号 文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 ...

  7. BFD协议简介

    1. 背景 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测.监控网络中链路或者IP路由的转发连通状况. 为了保护关键应 ...

  8. Model 特性

    表 1 AssociatedMetadataTypeTypeDescriptionProvider 通过添加在关联类中定义的特性和属性信息,从而扩展某个类的元数据信息. AssociationAttr ...

  9. angularjs 文件上传

    github连接地址:https://github.com/danialfarid/ng-file-upload 核心代码: html: <div class="form-group& ...

  10. POJ1741——Tree(树的点分治)

    1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...