后仿中必须读懂的User-defined primitives(UDP)

一 UDP定义规则

UDP,全名:User-defined primitives。 用户自己定义的原语。

UDP可分为:combinational UDP(组合逻辑)和 sequential UDP(时序逻辑)。

1.1 组合逻辑UDP

combinational UDP用于构建组合逻辑模型,常见有mux模块.

如下案例为2选1的mux,sel为1时,out为in1;sel为0时,out为in0。

请注意:信号列表中,输出信号out在第一个。状态表中,out处于最后一列。

1.2 时序逻辑UDP

sequential UDP用于构建寄存器DFF和锁存器latch模型。自然而来,sequential UDP可以是边沿触发,也可以是电平触发。

  • 时序逻辑 UDP 的输出端必须声明为 reg 型
  • 时序逻辑 UDP 可以用 initial 语句初始化
  • 状态表格式也稍有不同,时序UDP 格式 : ...    :  <current_state>  :  <next_state>  ;
  • 时序逻辑 UDP 状态表每行由 3 部分组成:输入部分、当前状态和输出状态,用冒号":"隔开
  • current_state 就是输出寄存器的当前值, next_state 就是输出寄存器的新值;next_state 由输入和 current_state 共同决定;
  • 状态表的输入项可以是电平,也可以是跳边沿的形式
1.2.1 电平触发UDP

 电平触发 UDP 的输出是根据输入电平状态的改变而改变。

带有清零端的 D 锁存器的功能描述为:

清零端为 1 时,输出端恒为 0 ;
清零端为 0 、使能控制端为 1 时,锁存器透明,输出端等于输入端;
清零端为 0 、使能控制端为 0 时,锁存器呈保持状态,输出端保持不变。
其真值表为(q 表示当前状态,q+ 表示下一个状态):

其实编写 UDP 的过程,可以理解为换一种格式编写真值表的过程。

带有清零端的 D 锁存器的 UDP 可以描述如下:

primitive d_latch(q, clear, en, d);
   output       q ;
   reg          q ;
   input        d, en, clear ;
 
   initial
     q = 0 ;
 
   table
    //clear     en      d       :q      :q+ ;
      1         ?       ?       :?      :0 ;    //clear
      0         0       ?       :?      :- ;    //"-" means stable
 
      0         1       0       :?      :0 ;    //q = d
      0         1       1       :?      :1 ;
   endtable
endprimitive

当然,也可以在罗列端口信号时就声明其类型,并且赋初值。

primitive d_latch2(
   output reg   q = 0,
   input        clear, en, d);
   ......
endprimitive

如下案例为一个低电平触发的latch。使用reg申明了一个内部变量,表示当前状态q,即当前udp的输出状态。table中的q+代表的是下一个有效周期的输出状态。

 

1.2.2 边沿触发UDP

边沿触发 UDP 的输出,是根据输入跳边沿和(或)输入电平状态的改变而改变。

下面举例,带有异步复位端(RST)且在时钟下降沿采集信号的 D 触发器的"真值表":

此"真值表"中还加入了上下沿的概念,是为了方便编写 UDP 代码。

此 D 触发器的时序逻辑 UDP 描述如下:

primitive D_TRI(
            output reg  Q = 0,
            input       RST, CP, D);
   table
      //RST       CP      D       :Q      :Q+ ;
      //(描述1) 清零
      1         ?       ?       :?      :0 ;  //RST=1 时清零
      (??)      ?       ?       :?      :- ;  //忽略 RST 边沿变化
      //(描述2) 时钟下降沿采集
      0         (10)    0       :?      :0 ;  //时钟下降沿采集信号
      0         (10)    1       :?      :1 ;
      //(描述3)possible negedge
      0         (1x)    ?       :?      :- ;  //可能是时钟下降沿时保持
      0         (x0)    ?       :?      :- ;
      //(描述4) 时钟上升沿保持
      0         (0?)    ?       :?      :- ;  //时钟上升沿时保持
      //(描述5)possible posedge
      0         (x1)    ?       :?      :- ;  //可能是时钟上升沿时保持
      //(描述6) 非时钟沿变化时,即便数据有跳变,输出仍然保持
      0         ?       (??)    :?      :- ;  
   endtable
endprimitive // D_TRI

 注意:

(1)状态表每行多个输入部分,最多只能有一个跳边沿,例如下面状态表的表述是错误的。

   table
      ......
      (10)     (10)    1       :?      :1 ;
   endtable

(2)电平触发的状态表输入项,其优先级高于边沿触发的状态表输入项。若两者在同一时刻出现,则输出端的状态由电平触发的状态表决定。

例如上述 D 触发器中,RST 可以看做是电平触发,CP 可以看做是边沿触发。当 RST 上升沿与 CP 端下降沿同时刻来临时,输出端会变为 0 ,如下图 cap 时刻。当然,实际的时序应该避免时钟和复位边沿同时到来。

(3)边沿触发 UDP 中,必须为每一个输入信号都指定边沿变化时输出信号的变化情况,否则在该信号的跳变沿处可能会造成输出端为 X 。

例如缺少 RST 边沿变化的说明:

    //(??)    ?       ?       :?      :- ; //忽略 RST 边沿变化

则在 RST 下降沿输出会变为 x。

再例如缺少时钟稳定、D 端数据变化时的说明:

    //(4) 非时钟沿变化时,即便数据有跳变,输出仍然保持
    //0         ?       (??)    :?      :- ;

则 D 端数据变化的边沿处也会使输出为 x。

如下所示为一个上升沿触发寄存器的模型。其中NOTIFIER信号用于建立时间和保持时间检查,通过建立时间和保持时间检查,则NOTIFIER不变,时序检测不通过则NOTIFIER翻转,udp_dff输出为x态。后仿真中的NOTIFIER是干什么用的!-CSDN博客

二 UDP 状态表符号缩写

三 UDP 设计指导 

针对数字设计时是选择使用 module 还是 primitive,要从设计需求、复杂度等方面进行综合考虑。下面给出一些指导性的建议。

  1. UDP 只能进行功能性建模,不能对电路时序和制造工艺(例如 CMOS,TTL等)进行建模。使用 UDP 的主要目的是以类似于真值表的简洁形式对数字设计进行建模,而 module 可以包含电路时序,并指定制造工艺。
  2. UDP 只能完成有一个输出端口的数字设计。当输出端口大于一个时,只能用 module。
  3. UDP 是使用内存中的查找表实现的,当输入端口较多时,输入端口的组合将会呈指数增长。UDP 输入端口的数量也会受到仿真器的限制。因此输入端口较多时不宜使用 UDP。
  4. 选择使用 UDP 以后,一定要尽可能的用缩写符完整的描述 UDP 状态表。漏掉输入的组合情况,输出端可能会出现 X 的状态,造成设计错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/600080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件系统测试方案书(测试计划-Word原件)

2 引言 2.1 编写目的 2.3 测试人员 2.4 项目背景 2.5 测试目标 2.6 简写和缩略词 2.7 参考资料 2.8 测试提交文档 2.9 测试进度 3 测试环境 3.1 软硬件环境 4 测试工具 5 测试策略 5.1 测试阶段划分及内容 5.1.1 集成测试 5.1.2 系统测试 5.1.2.1 功能测试 5.…

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

文章目录 前言NvDataInterfaceNvBlockNvM配置SWC配置RTE Mapping使用生成的接口操作NVM总结前言 NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断…

在Ubuntu上安装docker

一、安装docker 更新系统包列表&#xff1a; sudo apt-get update安装必要的依赖软件包&#xff0c;使apt可以通过HTTPS使用repository。 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common添加Docker的阿里云GPG密钥&#xff1a;…

算法提高之树的最长路径

算法提高之树的最长路径 核心思想&#xff1a;树形dp 枚举路径的中间节点用f1[i] 表示i的子树到i的最长距离,f2[i]表示次长距离最终答案就是max(f1[i]f2[i]) #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N …

数据结构(c):队列

目录 &#x1f37a;0.前言 1.什么是队列 2. 队列的实现 2.1定义队列节点 2.2定义队列 2.3队尾入队列 2.4判断队列是否为空 2.5队头出队列 2.6 队列首元素 2.7队尾元素 2.8队列内的元素个数 2.9销毁队列 3.试运行 &#x1f48e;4.结束语 &#x1f37a;0.前言 言C之…

[笔记] Win11 Microsoft Store App 离线下载

微软应用商店无法下载或下载缓慢解决方法 在一些环境下 Microsoft Store 下载速度缓慢&#xff0c;或者需要账号登录才能安装的场景&#xff0c;可以通过找到对应的离线安装包的形式进行安装。 Micorsoft Store 中的离线安装包一般后缀为 AppxBundle 和 Appx。以 Ubuntu 为例…

(四)JSP教程——request内置对象

request对象是将客户端浏览器数据提交给服务器端JSP页面的唯一数据通道&#xff0c;通过该通道JSP页面能够获取浏览器信息、form表单信息、URL参数信息等。 1.from表单向JSP文件传递数据 form表单是浏览器向服务器传递数据的一种基本机制&#xff0c;包含两种方式&#xff1a;…

智慧校园功平台能结构

高等教育信息化是促进高等教育改革创新和提高质量的有效途径&#xff0c;是教育信息化发展的创新前沿。进一步加强基础设施和信息资源建设&#xff0c;重点推进信息技术与高等教育的深度融合&#xff0c;能促进教育内容、教学手段和方法现代化&#xff0c;创新人才培养、科研组…

卷价格不如卷工艺降本增效狠抓模块规范化设计

俗话说&#xff0c;“卷价格不如卷工艺”&#xff0c;这意味着在追求成本控制和效率提升的过程中&#xff0c;蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新&#xff0c;而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…

推荐网站(5)Pika文字生成视频,ai视频创作

今天推荐一个网站&#xff0c;Pika文字生成视频&#xff0c;通过问题描述&#xff0c;帮我们生成对应的视频&#xff0c;非常的实用。 比如输入&#xff1a;一只小狗在河边洗澡 当然我们还可以在生成的视频上编辑 点击编辑后出来一些属性&#xff0c;可以修改区域&#xff0c…

TitanIDE安装常见问题解答

在软件开发和编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;扮演着至关重要的角色。TitanIDE作为一款功能强大的开发工具&#xff0c;深受广大开发者的喜爱。然而&#xff0c;在安装和使用TitanIDE的过程中&#xff0c;开发者们往往会遇到一些问题和挑战。针…

cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明一

一. 简介 前一篇文章学习了 cmake的一些目录属性&#xff0c;其中最重要的是 头文件搜索路径。文章如下&#xff1a; cmake进阶&#xff1a;目录属性说明一-CSDN博客 本文主要学习 一个目录属性 INCLUDE_DIRECTORIES&#xff0c;即头文件搜索路径。 二. cmake进阶&#xff1…

doris经典bug

在部署完登录web页面查看的时候会发现只有一个节点可以读取信息剩余的节点什么也没读取到 在发现问题后&#xff0c;我们去对应的节点去看log日志&#xff0c;发现它自己绑定到前端的地址上了 现在我们已经发现问题了&#xff0c;以下就开始解决问题 重置doris 首先对be进行操…

基于springboot+vue+Mysql的教师人事档案管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

在Java中如何有效地处理内存泄露

在Java中&#xff0c;处理内存泄露有多种方法&#xff0c;以下是其中三种常见的方法及其原理和适用场景&#xff1a; ## 1. 合理使用垃圾回收机制 Java中的垃圾回收机制&#xff08;Garbage Collection&#xff0c;GC&#xff09;是一种自动化的内存管理技术&#xff0c;它可以…

酸奶(科普)

酸奶&#xff08;yogurt&#xff09;是一种酸甜口味的牛奶饮品&#xff0c;是以牛奶为原料&#xff0c;经过巴氏杀菌后再向牛奶中添加有益菌&#xff08;发酵剂&#xff09;&#xff0c;经发酵后&#xff0c;再冷却灌装的一种牛奶制品。市场上酸奶制品多以凝固型、搅拌型和添加…

ENVI下实现遥感矿物蚀变信息提取

蚀变岩石是在热液作用影响下&#xff0c;使矿物成分、化学成分、结构、构造等发生变化的岩石。由于它们经常见于热液矿床的周围&#xff0c;因此被称为蚀变围岩&#xff0c;蚀变围岩是一种重要的找矿标志。利用围岩蚀变现象作为找矿标志已有数百年历史&#xff0c;发现的大型金…

Meta最新研究: Flash Attention 为何是系统性能瓶颈?

I. 引言 随着机器学习趋向于更大和更复杂的模型,模型训练过程变得越来越计算和资源密集。生成式AI的出现进一步推动了模型开发的边界,大型语言模型(LLMs)通常在数百或数千个GPU上训练数月。以LLaMA2的70-B参数模型为例,需要1,720,320 GPU小时来训练。对于如此长的训练作业,训练…

一键解密,网络安全神器现已问世!

一、简介 当前版本V1.1这款工具是一款功能强大的网络安全综合工具&#xff0c;旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能&#xff0c;包括解密、分析、扫描、溯源等&#xff0c;为用户提供了便捷的操作界面和丰富的功…

Python基础详解二

一&#xff0c;函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现某个功能的代码段 def myMethod(data):print("数据长度为",len(data))myMethod("dsdsdsds") 函数的定义&#xff1a; def 函数名(传入参数):函数体return 返回值 def m…