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

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

3天内不再提示

在SpinalHDL电路中进行信号的赋值

冬至配饺子 来源:Spinal FPGA 作者:玉骐 2022-07-28 18:16 次阅读

对于SpinalHDL电路描述,信号的赋值不免有些小伙伴带有些许迷茫,本篇抽丝剥茧,一块儿来梳理。

是val还是var?

先来看两个语法:

poYBAGLiYUaAerlMAAAxyFuFyMg400.png

对于变量a,声明为val,在对其进行第二次赋值时发现会报错,而声明为var的变量则正常。在Scala里,对于val和var的定义:

**val:不可变变量类型。

var:可变变量类型

这似乎与我们在其他语言中所接触的有些冲突,变量是不可变的为什么还叫变量呢?Scala是一门函数式编程语言,而在函数式编程里,其所倡导的往往是变量的赋值仅有一次,对于其他地方不会对该变量进行重新赋值,这也是引入val类型的原因,颇有些C语言中const类型的意味。

而下面的语句:

pYYBAGLiYVyAePMYAABN4KsGDp4153.png

这里变量c声明为val,其意味着c所指向的地址不可变更,但我们仍可以修改其指向的内容,这也正式为什么我们能对c(0)赋值,而无法再将c指向一个新声明的Array。

声明师=,赋值靠:=

有了上面的了解,再回到SpinalHDL电路描述里,我们在描述电路时,无论是寄存器还是Mem、这些都是电路对象,其声明有且仅应当只有一次,因而我们在定义变量时,往往这么来定义:

pYYBAGLiYW6AFeTiAAAS6hNzlwM758.png

在Scala里一切皆为class,这里我们声明a为一个UInt对象、b为一个RegNext(a)对象,即这里声明a、b均为8比特的寄存器,而寄存器本身一旦定义了是不可变的,为val类型。想一想倘若一会儿将a声明为8bit寄存器,一会儿声明为9比特寄存器,像Verilog中这么写:

pYYBAGLiYYKAE1_nAAARNt06Qp4376.png

想必没人会在Verilog中这么来写吧。同理,在SpinalHDL里,我们声明一个电路对象时,自然是=。

虽然电路对象不可改,就像声明了a是8bit,其一定是8bit,但这8bit所代表的值是可以改变的!!!这也正是我们描述电路里的赋值。

SpinalHDL里为电路对象的赋值提供了三种形式:

pYYBAGLiYZeABewYAACSCwiQpKs514.png

我们是为电路对象所代表的值进行赋值,而不是改变电路对象本身(把电路对象指向另一个对象,想一想是否和上面Array的赋值有点儿类似),因而这里我们是不能用=(=在Scala中本身也是一个方法,是改变变量指向的位置,玩不可行),因而所要采用的是SpinalHDL中提供的:=或者\=来给电路对象所代表的含义进行赋值:

pYYBAGLiYauAKkVMAAAeLVny_28278.png

由于只有声明为Reg类型的变量才会被当成寄存器类型,这里即可放心使用“:=”。

小结

劝君莫惧Scala,我们在电路描述里用到的语法特性并不多,若有systemverilog的基础那么对于这类软件语言入门没那么可怕,毕竟又不是去转大数据不是么?


审核编辑:刘清

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

    关注

    30

    文章

    5037

    浏览量

    117765
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128860
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33165
收藏 人收藏

    评论

    相关推荐

    浅析SpinalHDL中Pipeline中的复位定制

    之前有系列文章介绍了SpinalHDL中Pipeline的使用,最近在一个功能模块中真实的使用了这个lib。
    的头像 发表于 03-17 17:31 563次阅读
    浅析<b class='flag-5'>SpinalHDL</b>中Pipeline中的复位定制

    mapgis如何给区属性赋值

    MapGIS是一款功能强大的地理信息系统软件,它提供了丰富的功能和工具,使用户能够对地理数据进行快速、高效的管理和分析。其中一个重要的功能就是给区属性赋值,即对地图中的区域进行分类和标记,以便更好
    的头像 发表于 02-23 17:49 555次阅读

    proteus属性赋值工具怎么用

    Proteus是一种电路设计和仿真软件,在进行电路设计和仿真时,属性赋值是非常重要的步骤。属性赋值工具可以帮助用户快速有效地配置
    的头像 发表于 02-23 17:19 1228次阅读

    verilog同步和异步的区别 verilog阻塞赋值和非阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞赋值是两种不同的
    的头像 发表于 02-22 15:33 382次阅读

    G10指令可以对参数进行赋值,位型参数可以吗?

    G10指令可以对参数进行赋值,位型参数可以吗? G10指令是用于在加工程序中进行参数赋值的指令。它可以用于指定数值型参数或位型参数。 首先,让我们了解一下什么是位型参数。位型参数是一种
    的头像 发表于 02-18 10:49 189次阅读

    用TC399Aurix development studio中进行裸机驱动调试,有些全局变量不能被正确赋值的原因?

    最近用TC399Aurix development studio中进行裸机驱动调试,编译器选择HeghTec,驱动库用的是TC399 iLLD,Aurix development studio
    发表于 02-05 06:04

    #2024,立Flag了嘛? #win平台搭建SpinalHDL开发环境

    %\\\\lib; 系统变量path的 值里面添加%JAVA_HOME%\\\\bin和%JRE_HOME%\\\\jre\\\\bin 至此,对应的开发所用的软件安装结束,对应的仿真和波形显示不再赘述; 还有就是要在SBT文件中进行改写: 到此就所有工作完成了。
    发表于 01-21 10:52

    阻塞赋值与非阻塞赋值

    ”=“阻塞赋值与”
    的头像 发表于 09-12 09:06 652次阅读
    阻塞<b class='flag-5'>赋值</b>与非阻塞<b class='flag-5'>赋值</b>

    SpinalHDL Simulation性能提升测试

    昨晚看SpinalHDL的Issues,其中有一个关于性能提升的case 吸引到了我,尝试实验到深夜,测试下在SpinalHDL以及cocotb下的性能优化手段。
    的头像 发表于 08-06 17:10 421次阅读
    <b class='flag-5'>SpinalHDL</b> Simulation性能提升测试

    spinalhdl转Verilog可读性 SpinalHDL开发流程

    是比较陡峭的。另外在团队协作中,你可以要求你的同伴对Verilog,VHDL语言进行掌握,但是不能要求他们也掌握SpinalHDL,Chisel这些语言,所以你的代码怎么安排别人接手也是一个问题。但是这并不妨碍我们采用SpinalHDL
    的头像 发表于 07-27 09:29 870次阅读
    <b class='flag-5'>spinalhdl</b>转Verilog可读性 <b class='flag-5'>SpinalHDL</b>开发流程

    一文了解阻塞赋值与非阻塞赋值

    今天给大家普及一下阻塞赋值和非阻塞赋值的相关知识
    的头像 发表于 07-07 14:15 1468次阅读
    一文了解阻塞<b class='flag-5'>赋值</b>与非阻塞<b class='flag-5'>赋值</b>

    博途中SCL的赋值运算

    可通过赋值运算,可以将一个表达式的值分配给一个变量。赋值表达式的左侧为变量,右侧为表达式的值。
    的头像 发表于 06-19 10:57 4253次阅读

    Verilog中阻塞和非阻塞赋值金规

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值和非阻塞赋值。对于初学者,往往非常迷惑这两种赋值方式的用法,本章节主要介绍这两种文章的用法。其实,有
    的头像 发表于 06-01 09:21 573次阅读

    SpinalHDL语法之Bool类型

    作为SpinalHDL语法篇的第一节,我们也从最简单的开始。 Bool类型定义
    的头像 发表于 05-05 16:01 393次阅读

    SpinalHDL BlackBox时钟与复位

    SpinalHDL中使用之前已有的Verilog等代码的时候需要将这些代码包在一个BlackBox里面,但是如果这些代码里面有时钟和复位,我们需要怎么将时钟和复位端口和SpinalHDL中已有的时钟域连接起来呢?
    的头像 发表于 05-04 11:13 519次阅读
    <b class='flag-5'>SpinalHDL</b> BlackBox时钟与复位