当前位置: 首页 > news >正文

【Verilog】UDP用户原语

User-defined primitives

  • 概述
  • 基本语法
    • 组合逻辑的UDP
    • 时序逻辑的UDP
    • UDP 符号表

Verilog HDL(简称 Verilog )是一种硬件描述语言,用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。

Verilog 不仅定义了语法,还对语法结构都定义了清晰的仿真语义。因此,Verilog 编写的数字模型就能够使用 Verilog 仿真器进行验证


概述


在使用 Verilog 进行门级建模的时候,除了使用内置的门单元(and、or、nor等)之外,还可以使用自定义的逻辑门,这些自定义的逻辑门就是 User-defined primitives (UDPs)。

and、or、nor 等这些门单元属于是 Verilog 自带的一整套标准原语,即通常所说的内置原语。

但是当我们需要使用更加复杂的门电路的时候,这些内置原语不能满足需求,就需要使用 UDPs。

UDPs的出现,给予了IC工程师定义自己设计的基本逻辑元件的能力。但是 UDP 语句没有办法综合,因此它更多的使用在验证功能上。

UDPs 可以分为如三类:

  • 组合逻辑 UDPs
  • 时序逻辑 UDPs
  • 混合型 UDPs

基本语法


UDPs 的基本结构如下:

primitive name(/*在括号内定义端口*/); table/*在这里定义输入与输出的的关系*/endtableendprimitive

① primitive 和 endprimitive 类似于 module 和 endmodule;

② UDP可以有多个输入,但是只能存在一个输出,在端口声明的时候,输出端口需要处在第一个的位置上;

③ inout 双向端口在UDP中不被允许,同时无论是输入端口还是输出端口都必须是标量(即一位位宽);

④ 时序逻辑UDP,输出端口都需要定义成reg型;

⑤ 时序逻辑的UDP中,可以使用 initial 语句对 reg 类型变量(输出)进行赋初值;


组合逻辑的UDP


使用 UDPs 定义的一个 mux 如下所示:

primitive mux_tmp (q,d0,d1,s);output q;		// 输出端口放在第一个intput s,d0,d1;table//	d0	d1 	s	:	q0	?	0	:	0 ;1	?	0	:	1 ;?	0	1	:	0 ;?	1	1	:	1 ;0	o	x	:	0 ;1	1	x	:	1 ;endtable
endprimitive

关于状态表:

① 状态表的每一行的输出端口顺序一定要和端口列表相同;

② 输入和输出之间使用 : 隔开,每一行以 ; 结束;

③ 状态表中的值可以包含 0、1 或 x ,? 表示的是无关项。UDP不能处理z值,输入UDP的 z 值被当作 x 值处理;

④ 尽可能完整的列出UDP中的状态表,对于没有给出的输入组合情况,默认输出为不定态 x;


时序逻辑的UDP


① 时序逻辑的 UDP 的输出必须声明为 reg 类型,并且可以使用 initial 进行初始化;

② 时序逻辑 UDP 状态表的每一行内容为:<输入1><输入2>…<输入N> : <当前状态> : <下一状态>

③ 状态表的输入项可以是电平或者跳变沿的形式,输出项中的 - 表示的是状态保持不变

④ 当前状态是寄存器的当前值,下一状态是计算得到值会被存到寄存器中成为新值。


示例1:电平敏感

带清零端口的电平敏感的锁存器对应的 UDP 如下所示:

primitive latch(output reg q = 0input d, clock, clear);initial q = 0; 	// 锁存器的初始值为 0table  //	d   clock   clear  :  q : q+;?     ?       1    :  ? : 0;//	clock = 1 时将 d 值锁存到 q 中1     1       0    :  ?1;0     1       0    :  ? : 0;?     0       0    :  ? : -;endtable
endprimitive

示例2:边沿敏感

带清零端口,时钟下降沿敏感的 D 触发器的 UDP 如下:


primitive edge_dff(output reg q=0input d, clock, clear);
table
//  d  clock clear : q : q+;?    ?    1    : ? : 0 ;?    ?    (10) : ? : - ;    //(10) 由1向0跳变1    (10) 0    : ? : 1 ;0    (10) 0    : ? : 0 ;?    (1x) 0    : ? : - ;    //(1x)由1向不确定状态跳变?    (0?) 0    : ? : - ;    ?    (x1) 0    : ? : - ;(??) ?    0    : ? : - :    //(??)信号值再0,1,x三者之间任意跳变
endtable
endprimitive

UDP 符号表


在这里插入图片描述

http://www.lryc.cn/news/506992.html

相关文章:

  • 问题小记-达梦数据库报错“字符串转换出错”处理
  • MyBatis入门的详细应用实例
  • Sequelize ORM sql 语句工具
  • 增强LabVIEW与PLC通信稳定性
  • UDP系统控制器_音量控制、电脑关机、文件打开、PPT演示、任务栏自动隐藏
  • NK细胞杀伐功能如何实现?
  • Ubuntu搭建ES8集群+加密通讯+https访问
  • PC寄存器(Program Counter Register)jvm
  • 预览和下载 (pc和微信小程序)
  • 使用 DeepSpeed 微调 OPT 基础语言模型
  • BSM和BMS什么区别?
  • 使用Maven打包javaagent.jar
  • R语言混合模型回归GBTM群组轨迹模型绘图可视化研究
  • 【毕业设计】A079-基于Java的影院订票系统的设计与实现
  • Vue.js前端框架教程11:Vue监听器watch和watchEffect
  • 疾风大模型气象系统:精准预报,引领未来
  • U9应收单拉单生成时找不到退货单
  • 设计模式--单例模式【创建型模式】
  • 挑战一个月基本掌握C++(第七天)了解指针,引用,时间,输入输出,结构体,vector容器,数据结构 - 通用完结
  • 百度面试手撕 go context channel部分学习
  • Spring事务管理详解
  • 社区版 IDEA 开发webapp 配置tomcat
  • 打 印 菱 形
  • ffmpeg翻页转场动效的安装及使用
  • [RocketMQ] 发送重试机制与消费重试机制~
  • 基于Redis的网关鉴权方案与性能优化
  • 计算机网络-L2TP VPN基础概念与原理
  • Node.js day-01
  • vue el-dialog实现可拖拉
  • go配置文件