0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数字硬件建模SystemVerilog-组合逻辑建模(1)连续赋值语句

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-12-07 15:31 次阅读

数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。

组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出是两个输入的逻辑与。如果输入值发生变化,输出值将反映这一变化,组合逻辑的RTL模型需要反映这种门级行为,这意味着逻辑块的输出必须始终反映该逻辑块当前输入值的组合。

SystemVerilog有三种在可综合RTL级别表示组合逻辑的方法:连续赋值语句、always程序块和函数。接下来几篇文章将探讨每种编码风格,并推荐最佳实践编码风格。

0aaaae96-7600-11ed-8abf-dac502259ad0.png

连续赋值语句(布尔表达式)

连续赋值语句将表达式或操作结果驱动到网络或变量上,显式连续赋值语句是以assign关键字开始的语句。连续赋值语句的一个简单示例:

0ade14b6-7600-11ed-8abf-dac502259ad0.png

赋值的左边,即上面的sum;在上面的例子中,每当右边的值发生任何变化时,即在上面的例子中a或b发生变化时,sum就会更新。每当右边发生变化时,左边的这种持续更新行为就是组合逻辑行为的模型。

连续赋值语句允许在右侧发生更改和左侧更新之间指定传播延迟。然而,综合编译器预期RTL模型为零延迟,并且会忽略连续赋值语句中的延迟。这可能会导致经过延迟验证的设计与忽略延迟的综合实现之间不匹配。本系列文章只展示零延迟示例。

左侧类型。连续赋值语句的左侧可以是标量(1位)或向量,也可以是变量类型,也可以是用户定义的类型。左侧不能是未压缩的的结构体或未压缩的数组。

在连续赋值语句的左侧使用网络或变量之间有一个重要区别:

  • 网络类型(如wire或tri)可以由多个源驱动,包括多个连续分配、多个模块或基本实例的输出或输入端口连接,或驱动的任意组合。

  • 变量类型(如var或int)只能从单个源分配一个值,可以是:单个输入端口、单个连续赋值语句或任意数量的过程赋值(多个过程赋值被视为单个源;综合器要求多个过程赋值在同一个过程中)。

请注意,logic关键字推断出一种数据类型,但其本身不是网络或变量类型。当logic本身被使用时,一个变量被推断出来,并附带单个源赋值限制)。当使用logic关键字声明输出模块端口时,也会推断出一个变量。当使用logic关键字声明输入或inout模块端口时,将推断出具有多个驱动程序功能的wire类型。

最佳实践指南7-1
在连续赋值的左侧使用变量,为防止无意中出现多个驱动,只有打算让一个信号有多个驱动时,才在左侧使用wire或tri。

仅当需要多个驱动时使用网络类型(如wire或tri),例如共享总线、三态总线或inout双向模块端口。

对于RTL建模,语义规则的一个重要优点是变量只能有一个来源。ASICFPGA设备中的大多数信号大多数为单源逻辑,但三态总线和双向端口除外。变量的单源限制有助于防止无意中的编码错误,如果对具有变量类型的同一信号进行多个连续赋值语句或连接,则多源编码错误将在仿真和综合中报告为编译或布线错误。

向量宽度不匹配。连续赋值语句的左侧可以是与右侧的信号或表达式结果不同宽度的向量大小。出现这种情况时,SystemVerilog会自动调整右侧的向量宽度,以匹配左侧的大小。如果右侧的向量宽度大于左侧,则右侧的最高有效位将被截断为左侧的大小。如果右侧是较小的向量宽度大小,则右侧值将向左扩展到左侧的大小。如果表达式或运算结果是无符号的,则左扩展将用0扩展。如果右侧表达式或运算结果是有符号的,则将使用符号扩展。

最佳实践指南7-2
确保连续赋值语句和程序赋值的两侧向量宽度相同。避免左侧向量大小和右侧向量大小不匹配 。

在一些特例的情况下,赋值的右侧和左侧有不同大小的向量。这方面的一个例子是变量旋转操作(variable rotate operation)前面有介绍过,可以查看之前的文章。

显式和隐式推断的连续赋值语句

连续赋值语句有两种形式:显式连续赋值语句和隐式连续赋值语句。显式连续赋值语句是用assign关键字声明的,如前面的代码段和示例所示。这种形式的连续赋值语句既可以赋值给网络类型,也可以赋值给变量类型。隐式连续赋值语句将网络类型的声明与连续赋值语句相结合。即使未使用assign关键字,这种形式的连续性质也是可以推断出来的。

推断网络声明赋值示例如下:

0af413c4-7600-11ed-8abf-dac502259ad0.png

请注意,推断网络声明赋值语句与变量初始化语句不同,例如:

0b1041ca-7600-11ed-8abf-dac502259ad0.png

变量初始化只执行一次,而推断网络声明赋值是一个过程,每当右侧表达式上的值发生变化时,就会更新左侧网络。推断网络声明赋值语句是可综合的。

多次连续赋值语句

一个模块可以包含任意数量的连续赋值语句。每个连续赋值语句都是一个单独的过程,与其他连续赋值语句并行运行。所有连续赋值语句从仿真时间零点开始计算右侧运算,并运行到仿真结束。

一个模块中的多个过程分配可用于表示数据流行为,其中功能是用布尔方程建模的,布尔方程使用SystemVerilog操作符产生输出,而不是使用过程编程语句。在RTL模型中,数据流赋值表示数据在寄存器之间流动的组合逻辑。

下面的示例使用连续赋值语句来仿真通过加法器、乘法器和减法器的数据流。该数据流的结果在时钟每个正边缘被存储在寄存器中:

示例7-1:带寄存器输出的加、乘、减数据流处理
//`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
moduledataflow
#(parameterN=4)//bussize
(inputlogicclk,//scalarinput
inputlogic[N-1:0]a,b,c,//scalableinputsize
inputlogic[1:0]factor,//fixedinputsize
outputlogic[N-1:0]out//scalableoutputsize
);
timeunit1ns;timeprecision1ns;

logic[N-1:0]sum,diff,prod;

assignsum=a+b;
assigndiff=prod-c;
assignprod=sum*factor;

always@(posedgeclk)
out<= diff;

endmodule: dataflow
//`end_keywords

因为模块中的多个连续赋值语句并行运行,所以RTL源代码中赋值的顺序没有区别。这可以通过比较示例7-1中连续赋值语句的顺序和图7-1所示的综合结果中的数据流顺序看出来。RTL代码按加法、减法、乘法的顺序列出赋值语句,但操作的数据流是加法、乘法、减法。

0b1f3be4-7600-11ed-8abf-dac502259ad0.png
图7-1:示例7-1的综合结果

同时使用连续赋值语句和always程序

一个模块可以包含连续赋值语句和always程序的组合。

下面的简单示例演示了一个带有双向数据总线的静态RAM。当从RAM读取数据时,数据总线作为输出端口被驱动——当不被读取时,数据总线被分配高阻态,以便其他设备可以驱动该总线,连续赋值语句用于仿真输出功能,以及always程序用于仿真输入功能(方便在时钟上升沿触发)。

0b5a5b48-7600-11ed-8abf-dac502259ad0.png

数据总线是一个双向inout端口,必须是网络类型,如wire或tri,才能有多个驱动源。当数据总线是RAM的输出时,它可以由RAM驱动,当数据总线是RAM的输入时,它可以由其他模块驱动。只有连续赋值语句才能分配给网络数据类型。

每个连续赋值语句和每个always程序都是一个单独的并行过程,从仿真时间零点开始,在整个仿真过程中运行。模块中连续赋值语句和always程序的顺序并不重要,因为这些程序是并行运行的。

审核编辑 :李倩



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 锁存器
    +关注

    关注

    8

    文章

    904

    浏览量

    41441
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62418
  • 数据总线
    +关注

    关注

    2

    文章

    57

    浏览量

    17547

原文标题:数字硬件建模SystemVerilog-组合逻辑建模(1)连续赋值语句

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Matlab/Simulink/Stateflow建模开发及仿真测试

    matlab 模拟仿真 熟悉Matlab/Simulink/Stateflow建模开发及仿真测试,熟悉V模型开发流程。 熟悉自动代码生成,能够编写或者配置自动代码生成脚本。
    发表于 10-24 17:23

    使用C2000 MCU对用于数字控制的双向降压/升压转换器进行建模

    电子发烧友网站提供《使用C2000 MCU对用于数字控制的双向降压/升压转换器进行建模.pdf》资料免费下载
    发表于 10-12 11:48 0次下载
    使用C2000 MCU对用于<b class='flag-5'>数字</b>控制的双向降压/升压转换器进行<b class='flag-5'>建模</b>

    【「数字IC设计入门」阅读体验】+目录和前2章

    UDP50 6.3.3边沿触发的时序电路UDP51 6.3.4边沿触发和电平触发的混合行为51 6.4另一实例52 6.5表项汇总52 第7章数据流模型化54 7.1连续赋值语句54 7.2举例55 7.3
    发表于 10-10 17:12

    知识分享 | 轻松实现优质建模

    知识分享在知识分享栏目中,我们会定期与读者分享来自MES模赛思的基于模型的软件开发相关Know-How干货,关注公众号,随时掌握基于模型的软件设计的技术知识。轻松实现优质建模前言在基于模型的开发
    的头像 发表于 09-12 08:08 330次阅读
    知识分享 | 轻松实现优质<b class='flag-5'>建模</b>

    通向数字创新之路:25个组合电路核心主题概念

    组合电路是数字系统的基础构建模块。深入理解以下25个主题,将有助于全面掌握组合电路的原理和应用:01.布尔代数布尔代数是数字
    的头像 发表于 08-15 18:28 520次阅读
    通向<b class='flag-5'>数字</b>创新之路:25个<b class='flag-5'>组合</b>电路核心主题概念

    Python建模算法与应用

    Python作为一种功能强大、免费、开源且面向对象的编程语言,在科学计算、数学建模、数据分析等领域展现出了卓越的性能。其简洁的语法、对动态输入的支持以及解释性语言的本质,使得Python在多个平台
    的头像 发表于 07-24 10:41 454次阅读

    3d场景建模可视化,场景1:1还原

    在当今数字化时代,3D场景建模可视化技术成为重要工具,为各行业提供了强大的展示和交互手段。从电影特效到建筑设计,从游戏开发到虚拟现实,3D场景建模可视化已经深入到我们生活的各个领域。本文将深入探讨
    的头像 发表于 07-12 14:49 226次阅读

    cad如何进行三维建模

    三维建模是计算机辅助设计(CAD)中的一项重要技术,它可以帮助设计师在计算机上创建和编辑三维模型。本文将介绍如何使用CAD软件进行三维建模,包括建模的基本步骤、建模技巧和注意事项等。
    的头像 发表于 07-09 10:23 731次阅读

    隧道BIM如何设计和建模

    、协作工作、优化设计,并最大程度地提高项目效率和质量。下面是关于如何设计和建模隧道BIM的详细内容: 1.数据采集与建模需求确定:在设计之初,需要收集并整合地形、地质、气象等方面的数据,并确定设计需求和目标。这些数据将为后续BI
    的头像 发表于 06-04 15:54 352次阅读

    gis建模与空间分析的区别

    进行比较和解析。 首先,GIS建模是指将现实世界的地理实体和现象通过计算机技术和方法表达出来,用数字化的方式模拟、描述和分析。GIS建模可以分为两个方面,即地理数据模型和地理过程模型。地理数据模型是指通过特定的数据结构和模型来
    的头像 发表于 02-25 14:57 862次阅读

    ZWS云平台应用(1)-设备建模

    本文以温控器为例,介绍使用ZWS物联网云平台的第一步“设备建模”流程。不同类型的设备拥有不同的能力和属性,比如,空调设备是控制温度、风速,关注当前的温度值等。储能设备关心的是充放电、电池量、电压
    的头像 发表于 02-23 08:23 589次阅读
    ZWS云平台应用(<b class='flag-5'>1</b>)-设备<b class='flag-5'>建模</b>

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模
    的头像 发表于 02-22 16:24 2285次阅读

    SaberRD状态机建模工具介绍(一)什么是状态机建模

    状态机建模是使用状态图和方程式的手段,创建基于混合信号的有限状态机模型的一种建模工具。
    的头像 发表于 12-05 09:51 1632次阅读
    SaberRD状态机<b class='flag-5'>建模</b>工具介绍(一)什么是状态机<b class='flag-5'>建模</b>

    ADS/SystemVue/器件建模——线上介绍来了

    Keysight EDA工具在射频微波、射频系统设计、器件建模和高速数字领域提供完整的仿真流程,以协助客户实现准确仿真、通过自动化快速仿真以及实现仿真测试同源。
    的头像 发表于 11-30 16:02 1187次阅读
    ADS/SystemVue/器件<b class='flag-5'>建模</b>——线上介绍来了

    如何用ADIsimADC完成ADC建模

    电子发烧友网站提供《如何用ADIsimADC完成ADC建模.pdf》资料免费下载
    发表于 11-28 10:36 2次下载
    如何用ADIsimADC完成ADC<b class='flag-5'>建模</b>