chisel 语法

请添加图片描述


// TODO: find out the new way to have a reset signal
class KnightRider(resetSignal: Bool = null, frequ: Int)//extends Module(_reset = resetSignal) {extends Module {val io = IO(new Bundle {val led = Output(Bits(6.W))})//定义了一个枚举类型,包含两个状态goLeft和goRight,用于控制FSM。val goLeft :: goRight :: Nil = Enum(2)  //定义枚举类型val stateReg = RegInit(goLeft)val ledReg = RegInit(1.U(6.W))val tick = Module(new Tick(frequ))// Update FSM state and registers only with low frequency tickwhen(tick.io.tick === 1.U) {// State change one tick earlierwhen(ledReg(4) === 1.U) {stateReg := goRight}.elsewhen(ledReg(1) === 1.U) {stateReg := goLeft}when(stateReg === goLeft) {ledReg := ledReg << 1}.otherwise {ledReg := ledReg >> 1}}io.led := ledReg
}

= := 的区别。大体来讲,= 用来定义一个val,:= 用来连线。

reg

接下来,我们来定义寄存器register

Example 1.1.3

val r = Reg(UInt(4.W))
r := io.in
io.out := r

对应生成的Verilog代码是:

reg [3:0] r;
always @(posedge clock) beginr <= io_in;
end
assign io_out = r;

Example 1.1.3 的前两行可以简化为一行:

val r = RegNext(io.in)

这里 RegNext 表示一个寄存器,其参数为该寄存器的输入。r 会被推断为一个4-bit unsigned register,因为io.in是一个4-bit unsigned input。

更进一步,example 1.1.3可以压缩为一行代码:

io.out := RegNext(io.in)
另外,如果想在reset时初始化一个register,可以使用 RegInit:

val r = RegInit(0.U(4.W))
r := io.in

对应的Verilog代码如下:

reg [3:0] r;
always @(posedge clock) beginif (reset) beginr <= 4'h0;end else beginr <= io_in;end
end

Chisel新手教程(2)

wire reg

val data = Wire(UInt(10.W)) // This is a 10-bit wire
val dataR = Reg(UInt(10.W)) // This is a 10-bit register
val cnt = RegInit(0.U(8.W))
cnt := cnt + 1.U    // increases by 1 each clock cycle

uint

你可以对 UInt 进行比特提取操作。假设 a 是一个8bit数据,你可提取 a 的 bit1 至 bit3 生成一个新的信号。

val a = "b10010110".U
val b = a(3, 1)   // b is "b011".U

bool

Bool 表示布尔值,共有两个状态: true.B 或 false.B

val a = Wire(Bool())
a := true.B

Bool 可以被赋予 UInt 中的某一个比特

val data = Reg(UInt(7.W))
val bit0 = data(0)  // Bool
val bit2 = data(2)  // Bool

Note: 对于 UInt 信号的某一比特进行赋值是不支持的。下面的代码会导致编译报错: chisel3.internal.ChiselException: Cannot reassign to read-only …

val data = Wire(UInt(7.W))
data(2) := false.B  // Error !!  Not supported.

一种可行的替换方案是用 Vector of Bools.

val b = Wire(Vec(7, Bool()))
b(2) := someBool
data := b.asUInt

=== 等于and =/=

如需比较两个信号值是否相同或不同,用 === 和 =/=

假设 data0 和 data1 是 UInt 类型,如果 data0 等于 data1,下面的代码会设置 eq 的值为 true.B

val eq = data0 === data1  // eq is inferred as type Bool
val ne = data0 =/= data1  // ne is inferred as type Bool

Note: == is for Scala type, === is for Chisel hardware type.

Cat

Cat 可以将多个 UInt 或者 Bool 值拼成(catenate)一个新的 UInt.

val a = Wire(UInt(3.W))
val b = Wire(Bool())
a := 2.U
b := true.B
val c = Cat(4.U(3.W), b, a)  // c = "b1001010".U

Note: “b1001010”.U can also be written as “b100_1_010”.U to make it more readable. The underscore is ignored.


Chisel新手教程(3)

mux

Mux(condition, x, y)

when

when (condA) {r := x
}.elsewhen (condB) {r := y
}.otherwise {r := z
}

和 Verilog 类似,如果不定义 otherwise 的话,会认为 otherwise 为保持不变。因此要注意如果上例中 r 为 Wire 类型,不写 otherwise 的话则会生成 latch,这种情况一定要避免。

r := y
when (condA) { r := x }

Mux1H

在 chisel3.util 的package里提供了 one-hot 选择器 Mux1H。当我想实现一个 one-hot 的选择器时,我会选择用 Mux1H。


Chisel新手教程(4)

Bundle

Bundle 用来表示一组信号,例如下例中 x, y, z 三个信号组成一个 Bundle 信号 A

Example 1.0

class A extends Bundle {val x = Bool()val y = UInt(2.W)val z = UInt(4.W)
}

Directional Bundle

输入输出 Bundle 信号是有方向的,下例中 IO 接口包含一个 Input 和 Output Bundle 信号。

class Example extends Module {val io = IO(new Bundle() {val in = Input(new A)val out = Output(new A)})io.out := io.in
}

Valid & Decoupled IO

在实际工作中,我们经常会遇到数据信号携带一个 valid 指示,或者握手信号 valid/ready。Chisel 提供了 Valid 和 Decoupled 方法来给信号加入valid 或 valid/ready 信号。

例如对于开头 Example 1.0 里的 Bundle 信号 A,使用 Valid 方法可以得到 output valid 和 output A 。需要注意的是,要用 bits 来表示数据部分,也就是本例中的 A.

val outWithValid = Valid(new A)
...
val out_valid = outWithValid.valid
val out_A = outWithValid.bits     // Bundle A
val out_A_x = outWithValid.bits.x // x of Bundle A

如果需要 Input 形式的 Valid IO,可以用 Flipped 或 Input

val inWithValid = Flipped(Valid(new A))
val inWithValid = Input(Valid(new A))

Decoupled 方法可以再提供一个 input 的 ready。如下例所示:

val in = Decoupled(new A)
val out_valid = in.valid
val out_A = in.bits
in.ready := in_ready

同样,可以用 Flipped 进行方向取反操作,得到 output 的 ready 和 input 的 valid/bits

另外,Decoupled 信号还定义了一个 fire 信号。in.fire 等价于 in.valid && in.ready。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python将Excel数据导入Word并设置字体样式(成功)

在日常办公和数据处理中&#xff0c;我们经常需要将Excel中的数据导入到Word文档中。手动完成这个过程可能既费时又容易出错。本文将介绍如何使用Python自动化这一任务&#xff0c;同时根据数据的不同设置不同的字体样式和大小。 所需工具 Python&#xff1a;一种广泛使用的高…

kafka自定义分区策略详解

文章目录 前言一、kafka是什么&#xff1f;二、kafka的分区策略三、自定义的 Kafka 分区器实现总结 前言 在分布式消息系统中&#xff0c;正确地将消息发送到合适的分区是至关重要的。Kafka 作为一种高性能、可扩展的消息队列系统&#xff0c;在处理海量数据和高并发场景下表现…

三、05 ansible基础命令ansible 常用命令

这里写目录标题 命令介绍ansible 的基础语法实力 使用一个copy 模块 Ansible 模块功能查看工具ansible-doc的全部用法&#xff1a;mysql 实例 命令介绍 /usr/bin/ansible  (常用) Ansibe AD-Hoc 临时命令执行工具&#xff0c;常用于临时命令的执行 /usr/bin/ansible-playbo…

【Linux Day15 TCP网络通讯】

TCP网络通讯 TCP编程流程 接口介绍 socket()方法是用来创建一个套接字&#xff0c;有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型&#xff0c;使用 TCP 协议选择流式服务&#xff08;SOCK_STREAM&#xff09;。 **bind()方法是用来指定套接字使…

Quppy wise 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号

Quppy 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号 官网下载APP或者去香港区下载APP使用, 按照官方APP里的邮箱注册就行&#xff0c;成功后添加电话和个人信息&#xff1b;需要说明的是&#xff1a;网站所填内容请全部用真实身份填写&#xff1b;名在前&#xff0c;姓…

蓝桥杯每日一题-----数位dp

前言 今天浅谈一下数位dp的板子&#xff0c;我最初接触到数位dp的时候&#xff0c;感觉数位dp老难了&#xff0c;一直不敢写&#xff0c;最近重新看了一些数位dp&#xff0c;发现没有想象中那么难&#xff0c;把板子搞会了&#xff0c;变通也会变的灵活的多&#xff01; 引入…

六、java函数

文章目录 java函数1.1 什么是函数1.2 进一步理解函数1.2.1 参数传递1.2.2 理解返回 java函数 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 在编写代码过程中&#xff0c;如果需要经常做某一种操作&#xff0c;则类似的代码需要重复…

列式数据库、行式数据库简介

列式数据库、行式数据库简介 1、数据准备2、行式数据库3、列式数据库4、行式、列式存储对比 常见的行式数据库有Mysql&#xff0c;DB2&#xff0c;Oracle&#xff0c;Sql-server等&#xff1b;列数据库&#xff08;Column-Based&#xff09;数据存储方式按列存储&#xff0c;常…

2024/1/30 dfs与bfs

想要了解dfs与bfs&#xff0c;就得了解队列和栈。 一、栈与队列 1.栈 栈说白了就是先入后出。把栈类比为一个容器。只有一个口&#xff0c;所以如果我们想要取出最底层也就是最先放入的元素&#xff0c;只能最后取出它。 栈基础操作有如下几种&#xff1a; push 放入pop 拿…

python 爬虫安装http请求库

我的是window环境&#xff0c;安装的python3&#xff0c;如果再linux环境&#xff1a;pip install requests 开始&#xff1a; 上面我们成功发送请求并获取到响应&#xff0c;现在需要解析html或xml获取数据&#xff0c;因此我使用现成的工具库Beautiful Soup

leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

297.二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现…

图论练习3

内容&#xff1a;过程中视条件改变边权&#xff0c;利用树状数组区间加处理 卯酉东海道 题目链接 题目大意 个点&#xff0c;条有向边&#xff0c;每条边有颜色和费用总共有种颜色若当前颜色与要走的边颜色相同&#xff0c;则花费为若当前颜色与要走的边颜色不同&#xff0c;…

shell脚本中的变量,运算符

1.脚本格式 我们一般将shell脚本写在xxx.sh文件中&#xff0c;执行的时候bash/sh xxx.sh 注意文件路径 xxx.sh文件中的第一行为 #!/usr/bin/bash 注代表我们使用的是bin文件夹下的bash解释器(此条为注释语句&#xff0c;不写也可以) 2.echo用法 相当与print 示例1&…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时&#xff0c;依据官方文档操作下来碰到了几个问题&#xff0c;这边做个记录。 关键点就是配置 Content-Encoding&#xff0c;参数需要和代码中添加的提供程序的Key保持一致&#xff1b; builder.Services.AddRequ…

9、C语言复习

目录 1、位操作 2、define宏定义关键词 3、ifdef条件编译 4、extern变量申明 5、typedef类别别名 6、结构体 7、static关键字 1、位操作 &&#xff1a;按位与 |&#xff1a;按位或 ^&#xff1a;按位异或 ~&#xff1a;取反 <<&#xff1a;左移 >>…

【实战知识】使用Github Action + Nginx实现自动化部署

大家好啊,我是独立开发豆小匠。 先说一下背景~ 我的小程序:豆流便签,目前使用云托管部署后端服务,使用轻量级服务器部署数据库和一些中间件。 因此服务器成本:云托管 + 云服务器 云托管每周花费5元,一个月就是50,一年就是500啊,所以这期准备把云托管优化掉! 1. 需…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

java常用工具类【如spring 常用工具类,IO流常用工具类等】,持续更新

java常用工具类&#xff0c;持续更新 import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.util.ResourceUtils; import org.springfra…

【QT+QGIS跨平台编译】之二十六:【SpatialIndex+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、SpatialIndex介绍二、文件下载三、文件分析四、pro文件五、编译实践一、SpatialIndex介绍 SpatialIndex是一个用于高效处理空间数据的C++库,基于R树索引结构实现。它提供了一系列的空间操作和查询算法,能够快速地对大规模空间数据进行检索和分析。 SpatialInd…

【Django】如何设置支持多语种网站,中文/英文网站

首先&#xff0c;需要明确一点&#xff1a;我们要实现的中英对照翻译&#xff0c;这个翻译不是浏览器翻译的&#xff0c;也不是Django帮你翻译。这个需要你自己事先手动翻译好&#xff0c;存放在专门翻译文件中&#xff0c;Django只是事后调用而已。 第一步 新建项目后&#x…