Verilog语法回顾--用户定义原语

2024-03-31 13:52

本文主要是介绍Verilog语法回顾--用户定义原语,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

用户定义原语

UDP定义

UDP状态表

状态表符号

组合UDP

电平敏感UDP

沿敏感时序UDP


参考《Verilog 编程艺术》魏家明著

用户定义原语

用户定义原语(User-defined primitive,UDP)是一种模拟硬件技术,可以通过设计新的原语单元扩大门原语集合。UDP可以和门原语一样使用,用于表示要模拟的电路。

UDP分为两种:

1.组合UDP:使用输入值决定下一个输出值。

2.时序UDP:使用输入值和当前值决定下一个输出值,他可以模拟边沿敏感和电平敏感的行为,所以可以用来模拟触发器和锁存器。

每个UDP只能有一个输出,只能有3种状态:0,1和x。不支持z,如果输入值是z,那就就被当作x。对于时序UDP,输出值总是和内部状态保持一致。

UDP定义

UDP的定义独立于模块,它们和模块定义具有同样的语法层次,不能出现在关键字 module 和 endmodule 之间。

1.使用 primitive 和 endprimitive 定义UDP

2.使用与模块一样的方式声明端口和内部变量

3.使用内部状态表(State table)模拟UDP行为

4.UDP的实例化与模块的实例化类似,但是实例名是可选的,还可以使用延迟值。

UDP状态表

用于定义UDP的行为

1.状态表处于关键字 table endtable 之间,每一行要用分号 ;结束。

2.状态表的每一行都由一些字符组成,用于指出输入值和输出状态,支持01x,不支持z

3.状态表每一行输入状态的顺序要和UDP端口列表的顺序保持一致

4.对于组合UDP,输入信号一个区,输出信号一个区,输入区和输出区要用:分开。每一行用于定义在特定输入下的输出

5.对于时序UDP,在输入区和输出区之间要插入一个附加区。附加区用于表示当前UDP的状态,等价于当前输出值。这三个区同样用:分开。每一行用于定义在当前状态和特定输入组合下的输出。

6.如果所有输入都是x,那么输出值也是x。

7.没有必要清晰地列出所有输入组合,因为对于没有列出的输入组合,输出值默认x

8.不能对同样输入值的组合指定不同的输出值。

状态表符号

组合UDP

primitive tsmc_mux(q, d0, d1, s);output q;input d0, d1, s;table// d0  d1  s   q0   ?   0 : 0;1   ?   0 : 1;?   0   1 : 0;?   1   1 : 1;0   0   X : 0;1   1   X : 1;endtable
endprimitive

电平敏感UDP

与组合UDP的行为类似,只不过输出是reg类型,而且状态表表中要增加一个附加区。附加区用于表示当前UDP的状态,输出区用于表示UDP的下一个状态。

例子:简单的latch

primitive simple_latch(q, clock, data);output reg q;input clock, data;table//clock  data  q   q+0       1 : ? : 1;0       0 : ? : 0;1       ? : ? : -;endtable
endprimitive

例子: 带有复位和置位的Latch

primitive complex_latch(q, d, e, cdn, sdn, notifier);output reg q;input d, e, cdn, sdn, notifier;table1 1 1 ? ? : ? : 1;0 1 ? 1 ? : ? : 0;0 (10) 1 1 ? : ? : 0;1 (10) 1 1 ? : ? : 1;* 0 ? ? ? : ? : -;? ? ? 0 ? : ? : 1;? 0 1 * ? : 1 : 1;1 ? 1 * ? : 1 : 1;1 * 1 ? ? : 1 : 1;? ? 0 1 ? : ? : 0;? 0 * 1 ? : 0 : 0;0 ? * 1 ? : 0 : 0;0 * ? 1 ? : 0 : 0;? ? ? ? * : ? : x;endtable
endprimitive

沿敏感时序UDP

1.表中每一行最多只能有一个输入信号发生变化,(01) (10) 0 : 0 : 1,非法

2.对于所有没有指明的转换,输出默认为x

3.对于所有不改变输出状态的转换都要清晰的指明,否则就会导致输出变成x

4.如果时序UDP对每个输入的沿都敏感,那么这些沿在表中都要列出来

5.对于时序UDP,可以使用initial语句给输出状态一个初始值。

例子:简单的触发器

primitive simple_dff (q, clock, data);output reg q;input clock, data;table//clock data q q+// obtain output on rising edge of clock(01) 0 : ? : 0;(01) 1 : ? : 1; (0?) 1 : 1 : 1;(0?) 0 : 0 : 0;// ignore negative edge of clock(?0) ? : ? : -;// ignore data changes on steady clock? (??) : ? : -;endtable
endprimitive

UDP允许把沿敏感和电平敏感混合在一起使用。当输入变化时,沿敏感的变化先处理,电平敏感的变化后处理,所以当沿敏感和电平敏感的变化得出不同状态时,最后结果由电平敏感变化的结果决定。

例子:复杂JK触发器

primitive complex_jk_ff(q, clock, j, k, preset, clear);output reg q;input clock, j, k, preset, clear;table// clock  jk  pc  state  ouptut/next state?    ??  01 :   ?   :  1;?    ??  *1 :   1   :  1;?    ??  10 :   ?   :  0;?    ??  1* :   0   :  0;x    00  00 :   0   :  1;x    00  11 :   ?   :  -;x    01  11 :   ?   :  0;x    10  11 :   ?   :  1;x    11  11 :   0   :  1;x    11  11 :   1   :  0;f    ??  ?? :   ?   :  -;b    *?  ?? :   ?   :  -;b    ?*  ?? :   ?   :  -;endtable
endprimitive

这篇关于Verilog语法回顾--用户定义原语的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864495

相关文章

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

Java基础回顾系列-第九天-数据库编程

Java基础回顾系列-第九天-数据库编程 数据库简介工具包java.sql API 内容与数据库建立连接执行SQL语句数据库检索和更新查询结果SQL类型对应Java类型映射元数据异常 API方法DriverManagerConnectionStatementPreparedStatementCallableStatementResultSetjava.sql.Date批处理、存储过程、事务

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe