User Defined Primitives

这是一篇很浅显易懂的介绍Verilog UDP的文章,翻译过来留存,原文可参考这里。

介绍

Verilog有内建原语如门,传输管,开关等,这些都是相当小的原语,如果我们需要更为复杂的原语,verilog提供了UDP,也就是用户定义原语(User Defined Primitives). 使用UDP可以建模组合电路和时序电路。

语法

UDP以保留字primitive开始,以endprimitive结束,并紧接着原语的Ports/terminals。这与module的定义类似。UDP应该定义在module和endmoudle外面。

View Code

 1  //This code shows how input/output ports 2  // and primitve is declared 3   primitive udp_syntax ( 4   a, // Port a 5   b, // Port b 6   c, // Port c 7   d  // Port d 8   ); 9   output a;10   input b,c,d;11 12   // UDP function code here13   endprimitive

在上面的语法中,udp_syntax是原语的名字,包含端口a,b,c,d。

端口

  • 一个UDP只可以包含一个输出和最多10个输入。
  • 输出端口应该是第一个端口,然后才是一个或多个输入端口。
  • 所有的UDP都是标量,也就是,向量端口不允许。
  • UDP不能是双向端口。
  • 时序UDP的输出端需要额外声明为reg类型。
  • 组合UDP的输出端声明为reg类型是非法的。

功能体

原语的功能(包括组合和时序)在一个table表里描述,以保留字endtable结束。如以下代码所示。对于时序UDP,我们可以使用initial 给输出赋一个初始值。

View Code

 1 // This code shows how UDP body looks like 2 primitive udp_body ( 3   a, // Port a 4   b, // Port b 5   c  // Port c 6 ); 7   output a; 8   input b,c; 9   // UDP function code here10 // A = B | C;11   table12    // B  C    : A13        ?  1    : 1;14        1  ?    : 1;15        0  0    : 0;16 endtable17  18 endprimitive

注意:UDP不能在输入table中使用“Z”

TestBench

View Code

 1 `include "udp_body.v" 2 module udp_body_tb(); 3   reg b,c; 4   wire a;  5   udp_body udp (a,b,c); 6   initial begin 7     $monitor(" B = %b C = %b  A = %b",b,c,a); 8     b = 0; 9     c = 0;10     #1  b = 1;11     #1  b = 0;12     #1  c = 1;13     #1  b = 1'bx;14     #1  c = 0;15     #1  b = 1;16     #1  c = 1'bx;17     #1  b = 0;18     #1  $finish;19   end  20  21 endmodule

仿真输出

View Code

  B = 0 C = 0  A = 0  B = 1 C = 0  A = 1  B = 0 C = 0  A = 0  B = 0 C = 1  A = 1  B = x C = 1  A = 1  B = x C = 0  A = x  B = 1 C = 0  A = 1  B = 1 C = x  A = 1  B = 0 C = x  A = x

Table

Table 描述UDP的功能,语法很简单,表的每一行是一个条件,当一个输入改变,匹配输入条件得到输出。

Initial

初始赋值用于时序UDP的初始化。这个语句以initial关键字开始,紧接着的必须是一个赋值语句。

View Code

 1 primitive udp_initial (a,b,c); 2 output a; 3 input b,c; 4 reg a; 5  6 // a has value of 1 at start of sim 7 initial a = 1'b1;  8                9 table10 // udp_initial behaviour11 endtable12 13 endprimitive

符号

UDP使用特别的符号描述功能,如rising edge, don't care等等。如下表所示:

Symbol

Interpretation

Explanation

?

0 or 1 or X

? means the variable can be 0 or 1 or x

b

0 or 1

Same as ?, but x is not included

f

(10)

Falling edge on an input

r

(01)

Rising edge on an input

p

(01) or (0x) or (x1) or (1z) or (z1)

Rising edge including x and z

n

(10) or (1x) or (x0) or (0z) or (z0)

Falling edge including x and z

*

(??)

All transitions

-

no change

No Change


组合UDP

组合UDP中,输出是当前输入的函数。无论什么时候输入改变,UDP匹配表中的一行,输出状态被设置到那一行所指定的值。这与条件语句类似,table的每一行是一个条件。组合UDP的每一个输入或输出都以冒号分隔,表的每一行以分号结束。

注意:table的每一行输入的顺序必须和UDP定义中Header部分的端口列表输入端口顺序一致,但与端口声明的顺序无关。

  每一行定义输出是输入状态的特殊组合。

  如果所有的输入都指定X,那么输入必须指定为X。

  所有没有显性指定的组合都默认导致输出为X。

  相同的输入却指定不同的输出是非法的。

View Code

 1 // This code shows how UDP body looks like 2 primitive udp_body ( 3   a, // Port a 4   b, // Port b 5   c  // Port c 6 ); 7   output a; 8   input b,c; 9  10   // UDP function code here11 // A = B | C;12   table13    // B  C   : A14       ?  1    : 1;15       1  ?    : 1;16       0  0    : 0;17   endtable18   19  endprimitive

TestBench

View Code

 1  `include "udp_body.v" 2  module udp_body_tb(); 3   4  reg b,c; 5  wire a; 6   7  udp_body udp (a,b,c); 8   9  initial begin10    $monitor(" B = %b C = %b  A = %b",b,c,a);11    b = 0;12    c = 0;13     #1  b = 1;14     #1  b = 0;15     #1  c = 1;16     #1  b = 1'bx;17     #1  c = 0;18     #1  b = 1;19     #1  c = 1'bx;20     #1  b = 0;21     #1  $finish;22  end  23   24   endmodule

仿真输出

View Code

  B = 0 C = 0  A = 0  B = 1 C = 0  A = 1  B = 0 C = 0  A = 0  B = 0 C = 1  A = 1  B = x C = 1  A = 1  B = x C = 0  A = x  B = 1 C = 0  A = 1  B = 1 C = x  A = 1  B = 0 C = x  A = x


时序UDP - 电平敏感

电平敏感时序行为的描述与组合行为相同(除了输出需要声明为reg类型,且在table中有一个额外的区域,用于代表当前UDP的状态)。

输出声明为reg表示UDP有一个内部状态,UDP的输出总是与内部状态相同。时序UDP与组合UDP比起来,在输入和输出区域之间多了一个额外的区域,代表当前状态区域,且当前状态与当前输出值相同,这个区域也用冒号和输入输出分隔开。

View Code

 1   primitive udp_latch(q, clk, d) ; 2   output q;    3   input clk, d; 4    5   reg q; 6    7   table 8     //clk d    q     q+ 9     0     1  : ? :   1   ;10     0     0  : ? :   0   ;11     1     ?  : ? :   -   ; 12   endtable13   14   endprimitive

以上示例是一个低电平敏感的锁存器,q即使当前输出也是当前状态,q+即为下一个输出,表现和组合电路类似。

时序UDP - 边沿敏感

电平敏感行为中,输入的值和当前状态决定了输出值,但边沿敏感行为其输入的转换触发的输出改变是不同的。由于在组合和电平敏感中,问号(?)代表0, 1, 和x.破折号 (-) 指定输出值不改变。任何未指定的转换默认输出值为X。因而,在前一个例子中,clock从0到x且data等于0,当前状态等于1,导致输出q变为x。

不影响输出的所有转换必须显性的指定。否则,他们将导致输出值变为x。如果UDP对任何输入的边沿敏感,对所有输入的所有边沿都必须指定需要的输出状态。

示例UDP(with initial)

View Code

 1   primitive udp_sequential_initial(q, clk, d); 2   output q;  3   input clk, d; 4    5   reg q; 6    7   initial begin 8     q = 0; 9   end10   11   table12   // obtain output on rising edge of clk13 // clk         d        q       q+14     (01)         0   :   ?   :   0   ;15     (01)         1   :   ?   :   1   ;16     (0?)         1   :   1   :   1   ;17     (0?)         0   :   0   :   0   ;18   // ignore negative edge of clk19      (?0)         ?   :   ?   :   -   ; 20   // ignore d changes on steady clk21      ?      (??)      :   ?   :   -   ;22    endtable23   24   endprimitive

【完】

转载于:https://www.cnblogs.com/yuyan/archive/2011/12/28/2304392.html

Verilog UDP(User Defined Primitives)相关推荐

  1. FPGA笔记之verilog语言(基础语法篇)

    文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...

  2. Intel的ipp库(Integrated Performance Primitives)

    IPP库包含了许多底层优化的函数.如果已经安装了IPP库,opencv在运行时也会自动调用.NVIDIA公司针对GPU开发了的GPU加速的图像.视频.信号处理库NPP(NVIDIA Performan ...

  3. SDN(Software Defined Network) 软件定义网络学习

    SDN(Software Defined Network) 软件定义网络学习 SDN是啥? 简单来说就是软件定义网络!其旨在对现有的网络架构进行重构,使得我们能够像安装软件一样对网络进行修改,加快部署 ...

  4. SDP(Software Defined Perimeters)核心技术点

    SDP(Software Defined Perimeters)核心技术点 读了一下规范和行业分析,个人觉得SDP的技术核心点: SPA(Single Packet Authenticate) 因为C ...

  5. UDP(用户数据报协议)

    UDP数据报 一.UDP的概述(User Datagram Protocol,用户数据报协议) UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测. UDP ...

  6. TCP(传输控制协议)和UDP(用户数据报协议)的区别

    1)连接vs无连接: TCP面向连接,在收发数据前必须和对方建立可靠的连接: UDP是无连接的,发送数据前是不需要建立连接,当它想传送时就简单的去抓取来自应用程序的数据,并尽可能快的把它扔到网络上. ...

  7. 软件定义网络(Software Defined Network )

    一.SDN与传统网络的区别 SDN网络中数据转发平面进行分离,网络设备只负责单纯的数据转发:而传统网络中,网络设备硬件都带有操作系统同时负责逻辑控制和数据转发 SDN网络采用集中式控制,所有控制层面上 ...

  8. Verilog专题(二十四)Lemmings3

    HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 题目 In addition to walking and falling, Lemmings ca ...

  9. Verilog专题(二十二)Lemmings1

    HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page ​ 题目 The game Lemming involves critters with fairl ...

最新文章

  1. poj 2449 Remmarguts' Date 启发式搜索 A*算法
  2. 开始VC之路--创建窗体
  3. TOMCAT的域名配置
  4. BugkuCTF-MISC题善用工具
  5. MySQL 创建索引
  6. 互联网晚报 | 8月27日 星期五 | 爱奇艺取消未来几年偶像选秀节目;百度App月活跃用户突破6亿;陌陌连续26个季度盈利...
  7. php mysql刷新表格_PHP和AJAMYSQL数据库刷新表格
  8. 用js实现分页功能以及利用xml实现分页功能——数据岛
  9. Python Imaging Library: ImageFilter Module(图像滤波模块)
  10. 变量、作用域和内存问题
  11. 【经验心得】每刷新一次页面就顺序更换一张图片的js特效
  12. php手册 下载,php手册chm
  13. 关于四元数与欧拉角协方差阵转换的一些思考
  14. 几个项目管理的小故事
  15. 华为笔记本能装手机App了,华为移动应用引擎(公测版)
  16. 6.4.1 借贷账户信息
  17. 32g服务器做成虚拟,服务器32g内存 tomcat设置多大
  18. 基于javaweb的社区老年人网站系统
  19. 魔兽世界怀旧服——按键精灵 Java版(自动技能,练级释放者)
  20. 实习html周日志,实习日志:最后的一周

热门文章

  1. mysql 查询近几天的数据
  2. php linux下保存文件路径怎么写,linux下php导入带图片的word文档转为html,图片保存下来生成路径。...
  3. python treading模块
  4. window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式
  5. 肝!Python 网络编程
  6. 肝!打造一款高逼格的Vim神器
  7. 【机器学习】高斯判别分析
  8. java xslt 数据转换_如何将xslt结果转换为Java对象?
  9. python easygui_极客养成记/Python一点也不难/第四节
  10. java+stream+源码分析_java8学习之Stream源码分析