SystemVerilog学习-03-设计特性与接口

简介: SystemVerilog学习-03-设计特性与接口

设计特性


  • 添加接口,将通信和协议检查进一步封装。
  • 添加类似c语言的数据类型。
  • 添加用户自定义类型,如枚举类型、结构体类型。
  • 添加类型转换。
  • 添加包(package)从而使得多个设计之间可以共享公共类型和方法。
  • 添加方便的赋值操作符和运算操作符,例如++、十=、===。
  • 添加priority和uniquecase语句。
  • 添加always_comb、always_latch和always_ff等过程语句块。

过程语句块


SV添加了新的面向硬件的过程语句块,从而使得该语句块可以更清楚地表达设计者的意图。always语句块被细分为了:

  1. 组合逻辑语句块: always_comb
  2. 锁存逻辑语句块:always_latch
  3. 时序逻辑语句块:always_ff

always_comb


always_comb可以自动嵌入敏感列表。可以禁止共享变量,即赋值左侧的变量无法被另—个过程块所赋值。软件工具会检查该过程块,如果其所表示的不是组合逻辑,那么会发出警告。在仿真的0时刻也会自动触发一次,无论0时刻是否有敏感信号列表中的信号变化。

verilog的@*敏感列表声明方式不同always_comb。 @*:

  • @*不要求可综合的建模要求,但always_comb则会限制其他过程块对同一变量进行赋值。
  • @*的敏感列表可能不完全,例如如果一个过程块调用一个函数,那么@*则只会将该函数的形式参数自动声明到敏感列表,而不将该函数展开。
  • always_comb则将被调用函数中可能参与运算的其它信号也声明到敏感列表中。

always_latch


表示锁存逻辑,且自动插入敏感列表。并且EDA工具会检查always_ latch过程块是否真正实现了锁存逻辑。

always_ff


表示时序逻辑,敏感列表必须指明posedge 或者 negedge,这是综合要求的。使得EDA工具实现同步或者异步的复位逻辑。EDA工具也会检查always_ff过程块语句是否实现了时序逻辑。

赋值操作


Verilog没有简单的方法可以对向量填充1。

parameter N=64;
reg [N-l:0] data_bus;
data_bus = 64' hFFFFFFFFFFFFFFF; //set all bits of data_bus to 1

sV可以通过’0,'1,‘z和’×来分别填充0,1,z和x。通过这种方法,代码会根据向量的宽度自动填充,这提高了代码的便捷性和复用性。

sv在比较数据中,对于全匹配,通常使用===;可以使用==?进行通配比较。在比较操作符的右侧操作数,如果在某些位置有X或者Z,那么它表示的是在该位置上会与左侧操作数的相同位置的任何值相匹配。

image.png

sv中添加了inside操作符来检查数值是否在一系列值的集合中。下面的if语句中的多个条件判断可以变得更为简化:

logic [2: 0] a ;
if ( ( a==3'b001) ll (a==3' b010) ll ( a==3'b100) )...
替换为
if ( a inside { 3' b001,3'b010,3'bl00} )...

增强的case语句


仿真和综合可以会将case语句做不同的翻译。Verilog定义case语句在执行时按照优先级,而综合编译器则会优化case语句中多余的逻辑。为了保持仿真与综合的一致性,SV提供了unique和priority的声明,结合case, casex和casez来进一步实现case对应的硬件电路。

unique和priority的声明也可以结合if…else条件语句使用。unique和priority使得仿真行为同设计者希望实现的综合电路保持一致。

unique case


unique case 要求每次case选择必须只能满足一个case项,同时不能有重复的选项,既满足多个选项的条件。unique case 可以并行执行,并且case选项必须完备。

priority case


priority case 表示至少有一个case选项满足要求。如果有多个case选项满足时,第一个满足的分支将被执行。 priority case的逻辑同if…else的逻辑一致。

接口


SV在veriliog语言的基础上拓展了接口。接口提供了一种新型的对抽象性建模的方式。接口 的使用简化了建模和验证大型复杂的设计。verilog上通过模块之间进行端口连接来完成模块间的通信的。

image.png

对于以上的连接,按照Verilog的方式,将按照以下步骤进行:

  1. 对每一个子模块进行端口声明。
  2. 在上层环境,需要声明非常多的网线。
  3. 将上层环境的网线在各个模块之间进行连接。

这种方式使得一些常用总线端口也不得不在多个模块重复声明。—些通信协议也不得不在多个模块中重复定义。在不同模块之间的连接可能会出现不匹配的信号声明和连接。—个设计发生了变化,可能会影响多个模块的端口声明和连接。

SV添加了新的抽象端口类型interface。interface允许多个信号被整合到一起用来表示一个单一的抽象端口。多个模块因此可以使用同一个interface,继而避免分散的多个端口信号连接。

接口不单单可以包含变量或者线网,它还可以封装模块之间通信的协议。接口中还可以嵌入与协议有关的断言检查、功能覆盖率收集等模块。接口不同于模块(module) 的地方在于,接口不允许包含设计层次,即接口无法例化module,但是接口可以例化接口。接口中可以进一步步明modport来约束不同模块连接时的信号方向。

接口的声明


接口的定义类似模块定义。接口可以有端口,例如外部接入的时钟或者复位信号。接口内部可以声明所有的变量或者线网类型。

接口的例化


接口的例化方式同模块例化,模块的端口如果声明为input,output或者inout,那么在例化时可以不连接。模块端口如果声明为interface,那么在例化时必须连接到一个接口实例,或者另外一个接口端口。

如果一个模块拥有一个接口类型端口,那么要索引该接口中的信号,需要通过以下方式进行:

<port _name>.<internal_interface_signal_name>
always @(posedge bus.clock, negedge bus.resetN)

modport


接口中的变量或者线网信号,对于连接到该接口的不同模块则可能具备这不同的连接方向。所以接口引入了modport来作为module port的缩写,表示不同的模块看到同一组信号时的视角(连接方向)。在接口中声明modport,需要指明modport中各个信号的方向。

接口中的变量或者线网信号,对于连接到该接口的不同模块则可能具备着不同的连接方向。接口引入了modport来作为module port的缩写,表示不同的模块看到同一组信号时的视角(连接方向)。在接口中声明modport,需要指明modpot中各个信号的方向。

当一个模块在例化时,可以选择连接到interface端口中具体的某一个modport。这种方式可以降低方向连接错误的可能,进而避免信号多驱动的情况。

接口小结


接口对于设计复用非常有利。接口减少了模块之间错误连接的可能性。如果要添加新的信号,只需要在接口中声明,而不必在模块中声明。由于接口将有关信号都集合在一起,因此在使用这些信号时需要多添加一个层次(接口实例名)。接口往往会将有关的信号集合在一起,这意味着对于拥有多组不相关信号的设计而言,它可能需要有多个接口实例才能完成与其它模块的连接。

目录
相关文章
|
6月前
|
安全 Java 数据安全/隐私保护
|
5月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
64 7
|
Go 开发者
一文详解Go语言接口嵌套组合的精髓!
一文详解Go语言接口嵌套组合的精髓!
187 0
|
6月前
|
设计模式 存储 安全
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
【C++ 基本概念】C++编程三剑客:模板、多态与泛型编程的交织与差异
381 0
|
6月前
针对抽象编程与对应的好处
针对抽象编程与对应的好处
49 1
|
编译器 C#
【C#本质论 六】类-从设计的角度去认知(封装)(下)
【C#本质论 六】类-从设计的角度去认知(封装)(下)
87 0
|
存储 Java 程序员
【C#本质论 六】类-从设计的角度去认知(封装)(上)
【C#本质论 六】类-从设计的角度去认知(封装)(上)
109 0
|
安全 前端开发 测试技术
SystemVerilog学习-01-系统验证概述(一)
SystemVerilog学习-01-系统验证概述
334 0
SystemVerilog学习-01-系统验证概述(一)
|
程序员 数据安全/隐私保护 C++
C++面向对象封装特性的实例分析与应用扩展(一)
生活中充满复杂性,处理复杂性的方法之一就是简化和抽象。在计算中,为了根据信息与用户之间的接口来表示它,抽象是至关重要的。将问题的本质特征抽象出来,并根据特征来描述解决方案。抽象往往是用户定义类型的捷径,在C++中用户定义类型指的就是实现抽象接口的类设计。
129 1
C++面向对象封装特性的实例分析与应用扩展(一)
|
监控 安全 搜索推荐
SystemVerilog学习-01-系统验证概述(二)
SystemVerilog学习-01-系统验证概述
405 0
SystemVerilog学习-01-系统验证概述(二)