一、Reset三种类型

Chisel3.2.0开始,Chisel 3支持同步和异步复位,这意味着我们可以生成同步复位和异步复位寄存器。寄存器的类型取决于与其相关的复位信号的类型。

  • Bool - constructed with Bool(). 同步复位信号
  • AsyncReset - constructed with AsyncReset(). 异步复位信号
  • Reset - constructed with Reset(). 自动推断类型的抽象reset

二、Reset类型推断

这里的英文还不太理解,就不翻译了,直接贴出原文。

三、隐式的Reset

具有隐式复位信号的ModuleMultiIOModule的隐式reset是抽象的Reset类型,并且默认推断为Bool类型的,也就是同步信号。

但是我们可以在定义模块时通过混入以下特质,覆盖掉自动推断的模式,将reset的类型设置成我们想要的类型。如下所示:

  • RequireSyncReset - sets the type of reset to Bool
  • RequireAsyncReset - sets the type of reset to AsyncReset
class MyAlwaysSyncResetModule extends MultiIOModule with RequireSyncReset {val mySyncResetReg = RegInit(false.B) // reset is of type Bool
}
class MyAlwaysAsyncResetModule extends MultiIOModule with RequireAsyncReset {val myAsyncResetReg = RegInit(false.B) // reset is of type AsyncReset
}

四、类型不确定的Reset举例

class ResetAgnosticRawModule extends RawModule {val clk = IO(Input(Clock()))val rst = IO(Input(Reset()))val out = IO(Output(UInt(8.W)))val resetAgnosticReg = withClockAndReset(clk, rst)(RegInit(0.U(8.W)))resetAgnosticReg := resetAgnosticReg + 1.Uout := resetAgnosticReg
}

在上述代码中,rst的定义使用的是Reset(),此时的复位信号的类型需要自动推断,所以寄存器resetAgnosticReg是同步还是异步我们并不知道。

我觉得这样做的好处是,当我们给上述模块分别提供同步复位信号和异步复位信号时,可以使其生成不同的电路,也即产生不同类型的寄存器。接下来会结合强制类型转换举一个具体的例子。

五、Reset类型强制转换

在三中我们已经说过,我们可以手动设置隐式复位信号的类型,这里再介绍另一种方式:

  • .asBool将Reset类型强制转换成Bool
class ForcedSyncReset extends MultiIOModule {val out = IO(Output(UInt(8.W)))// withReset's argument becomes the implicit reset in its scopewithReset (reset.asBool()) {// RawModules do not have implicit resets so withReset has no effectval myRawModule = Module(new ResetAgnosticRawModule)// We must drive the reset port manuallymyRawModule.clk := Module.clock// Module.reset grabs the current implicit resetmyRawModule.rst := Module.reset out := myRawModule.out}
}
module ResetAgnosticRawModule(input        clk,input        rst,output [7:0] out
);
`ifdef RANDOMIZE_REG_INITreg [31:0] _RAND_0;
`endif // RANDOMIZE_REG_INITreg [7:0] resetAgnosticReg; // @[Reset.scala 17:61]wire [7:0] _T_1 = resetAgnosticReg + 8'h1; // @[Reset.scala 18:40]assign out = resetAgnosticReg; // @[Reset.scala 19:7]always @(posedge clk) beginif (rst) begin // @[Reset.scala 17:61]resetAgnosticReg <= 8'h0; // @[Reset.scala 17:61]end else beginresetAgnosticReg <= _T_1; // @[Reset.scala 18:20]endend
endmodule

这里展示的是生成的子模块的代码。reset.asBool()使得此时的隐式复位信号reset的类型为Bool,也即同步复位,所以此时的寄存器resetAgnosticReg也是同步复位的。之所以是同步复位,是因为生成的verilog代码中,复位信号rst没有出现在always的敏感列表中。


  • .asAsyncReset将Reset类型强制转换成AsyncReset
class ForcedSyncReset extends MultiIOModule {val out = IO(Output(UInt(8.W)))// withReset's argument becomes the implicit reset in its scopewithReset (reset.asAsyncReset()) {// RawModules do not have implicit resets so withReset has no effectval myRawModule = Module(new ResetAgnosticRawModule)// We must drive the reset port manuallymyRawModule.clk := Module.clock// Module.reset grabs the current implicit resetmyRawModule.rst := Module.reset out := myRawModule.out}
}
module ResetAgnosticRawModule(input        clk,input        rst,output [7:0] out
);
`ifdef RANDOMIZE_REG_INITreg [31:0] _RAND_0;
`endif // RANDOMIZE_REG_INITreg [7:0] resetAgnosticReg; // @[Reset.scala 17:61]assign out = resetAgnosticReg; // @[Reset.scala 19:7]always @(posedge clk or posedge rst) beginif (rst) beginresetAgnosticReg <= 8'h0;end else beginresetAgnosticReg <= resetAgnosticReg + 8'h1;endend
endmodule

这里展示的是生成的子模块的代码。asAsyncReset()使得此时的隐式复位信号reset的类型为AsyncReset,也即异步复位,所以此时的寄存器resetAgnosticReg也是异步复位的。之所以是异步复位,是因为生成的verilog代码中,复位信号rst出现在了always的敏感列表中。


参考链接:https://www.chisel-lang.org/chisel3/docs/explanations/reset.html

chisel Reset的三种类型和同步异步寄存器相关推荐

  1. STM32F103系列实战之通用同步异步收发器(USART)

    通用同步/异步收发器(USART) STM32F103xC. STM32F103xD和STM32F103xE增强型系列产品中,内置了3个通用同步/异步收发器(USART1. USART2和USART3 ...

  2. 简单理解浏览器的event loop 和 JavaScript的同步异步

    为什么JavaScript是单线程的? JavaScript的主要用途是和用户进行交互以及对DOM的操作,为了避免复杂的同步问题(如果多线程,A线程对某DOM添加内容,B线程对它又进行了删除操作,这往 ...

  3. 异步通知是什么意思_一次相亲经历,我彻底搞懂了阻塞非阻塞、同步异步

    看到标题,可能你会想,相亲跟阻塞/非阻塞,同步/异步有啥关系,这个逗b不知道在想什么东西.不要急,且听我慢慢道来 年纪大了,一回家七大姑八大姨就各种催婚,都说要给我介绍女朋友.这不,刚刚门口,我的大姨 ...

  4. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  5. Node.js前置知识点(二):同步/异步

    前言 本文是node.js前置知识系列文章的第二篇,主要介绍 同步/异步:阻塞/非阻塞 的相关概念 (参考来源 见文末的 Reference) 一 什么是 同步/异步 同样从 What的角度开始介绍, ...

  6. 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  7. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一.阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例.(对操作系统而言,所有的输入 ...

  8. java 协程框架_GitHub - yaozhang0105/dactor: Dactor是基于Java的轻量级同步异步统一处理框架,基于协程思想构建...

    DActor Introduction DActor框架基于协程思想设计,可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发.无阻塞和同步代码的易读 ...

  9. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

最新文章

  1. php获取post表单数据_PHP如何通过post方法来获取form表单中数据?(代码示例)
  2. WSS 3.0 Object Model
  3. php 使用sendgrid api 发送邮件_linux - 使用命令发送邮件
  4. 【Linux】gcc和g++的区别
  5. css就近原则_细品100道CSS知识点(上)「干货满满」
  6. c++string类的常用方法详解
  7. html中鼠标左键自定义多级菜单,CSS多级菜单的实现代码
  8. Redis集群环境搭建实践
  9. 数据库基础知识和SQL语言
  10. 「 机器人学 」机器人与控制工程基础浅谈
  11. SQL查询语句可以执行,但是提示对象名无效
  12. C++程序的设计机制1 NVI机制
  13. 测试工程师面试一般常用问题
  14. Web 前端面试题总结
  15. 跨境电商的支付有段有哪些?
  16. 网络分层的真实含义是什么?
  17. 聊天机器人系统的组成结构及关键技术
  18. 情不知所起,一 网 而深
  19. u盘坏了数据可以恢复吗?用u盘数据恢复软件
  20. arduino液位传感器_使用Arduino读取水位传感器数据

热门文章

  1. javascript学习1-变量和语句
  2. 消消乐要求 c语言程序,C++语言实现开心消消乐
  3. 强化学习(Reinforcement Learning)背景介绍
  4. 揭秘三端型肖特基二极管检测好坏的方法
  5. 精华 | 恩墨学院侯圣文:大数据时代下的 DBA 该何去何从?
  6. IOT-OS之RT-Thread(十三)--- 网络分层结构 + netdev/SAL原理
  7. float的定义问题
  8. 小程序,公众号微信客服消息开发
  9. 知道创宇前端一面面经
  10. Wi-Fi理论基础概述