Verilog UDP(User Defined Primitives)
User Defined Primitives
这是一篇很浅显易懂的介绍Verilog UDP的文章,翻译过来留存,原文可参考这里。
l 介绍
Verilog有内建原语如门,传输管,开关等,这些都是相当小的原语,如果我们需要更为复杂的原语,verilog提供了UDP,也就是用户定义原语(User Defined Primitives). 使用UDP可以建模组合电路和时序电路。
l 语法
UDP以保留字primitive开始,以endprimitive结束,并紧接着原语的Ports/terminals。这与module的定义类似。UDP应该定义在module和endmoudle外面。
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。
l 端口
- 一个UDP只可以包含一个输出和最多10个输入。
- 输出端口应该是第一个端口,然后才是一个或多个输入端口。
- 所有的UDP都是标量,也就是,向量端口不允许。
- UDP不能是双向端口。
- 时序UDP的输出端需要额外声明为reg类型。
- 组合UDP的输出端声明为reg类型是非法的。
l 功能体
原语的功能(包括组合和时序)在一个table表里描述,以保留字endtable结束。如以下代码所示。对于时序UDP,我们可以使用initial 给输出赋一个初始值。
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
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
仿真输出
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关键字开始,紧接着的必须是一个赋值语句。
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。
相同的输入却指定不同的输出是非法的。
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
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
仿真输出
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比起来,在输入和输出区域之间多了一个额外的区域,代表当前状态区域,且当前状态与当前输出值相同,这个区域也用冒号和输入输出分隔开。
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)
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)相关推荐
- FPGA笔记之verilog语言(基础语法篇)
文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...
- Intel的ipp库(Integrated Performance Primitives)
IPP库包含了许多底层优化的函数.如果已经安装了IPP库,opencv在运行时也会自动调用.NVIDIA公司针对GPU开发了的GPU加速的图像.视频.信号处理库NPP(NVIDIA Performan ...
- SDN(Software Defined Network) 软件定义网络学习
SDN(Software Defined Network) 软件定义网络学习 SDN是啥? 简单来说就是软件定义网络!其旨在对现有的网络架构进行重构,使得我们能够像安装软件一样对网络进行修改,加快部署 ...
- SDP(Software Defined Perimeters)核心技术点
SDP(Software Defined Perimeters)核心技术点 读了一下规范和行业分析,个人觉得SDP的技术核心点: SPA(Single Packet Authenticate) 因为C ...
- UDP(用户数据报协议)
UDP数据报 一.UDP的概述(User Datagram Protocol,用户数据报协议) UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测. UDP ...
- TCP(传输控制协议)和UDP(用户数据报协议)的区别
1)连接vs无连接: TCP面向连接,在收发数据前必须和对方建立可靠的连接: UDP是无连接的,发送数据前是不需要建立连接,当它想传送时就简单的去抓取来自应用程序的数据,并尽可能快的把它扔到网络上. ...
- 软件定义网络(Software Defined Network )
一.SDN与传统网络的区别 SDN网络中数据转发平面进行分离,网络设备只负责单纯的数据转发:而传统网络中,网络设备硬件都带有操作系统同时负责逻辑控制和数据转发 SDN网络采用集中式控制,所有控制层面上 ...
- Verilog专题(二十四)Lemmings3
HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 题目 In addition to walking and falling, Lemmings ca ...
- Verilog专题(二十二)Lemmings1
HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 题目 The game Lemming involves critters with fairl ...
最新文章
- poj 2449 Remmarguts' Date 启发式搜索 A*算法
- 开始VC之路--创建窗体
- TOMCAT的域名配置
- BugkuCTF-MISC题善用工具
- MySQL 创建索引
- 互联网晚报 | 8月27日 星期五 | 爱奇艺取消未来几年偶像选秀节目;百度App月活跃用户突破6亿;陌陌连续26个季度盈利...
- php mysql刷新表格_PHP和AJAMYSQL数据库刷新表格
- 用js实现分页功能以及利用xml实现分页功能——数据岛
- Python Imaging Library: ImageFilter Module(图像滤波模块)
- 变量、作用域和内存问题
- 【经验心得】每刷新一次页面就顺序更换一张图片的js特效
- php手册 下载,php手册chm
- 关于四元数与欧拉角协方差阵转换的一些思考
- 几个项目管理的小故事
- 华为笔记本能装手机App了,华为移动应用引擎(公测版)
- 6.4.1 借贷账户信息
- 32g服务器做成虚拟,服务器32g内存 tomcat设置多大
- 基于javaweb的社区老年人网站系统
- 魔兽世界怀旧服——按键精灵 Java版(自动技能,练级释放者)
- 实习html周日志,实习日志:最后的一周
热门文章
- mysql 查询近几天的数据
- php linux下保存文件路径怎么写,linux下php导入带图片的word文档转为html,图片保存下来生成路径。...
- python treading模块
- window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式
- 肝!Python 网络编程
- 肝!打造一款高逼格的Vim神器
- 【机器学习】高斯判别分析
- java xslt 数据转换_如何将xslt结果转换为Java对象?
- python easygui_极客养成记/Python一点也不难/第四节
- java+stream+源码分析_java8学习之Stream源码分析