当前位置:网站首页>吃透Chisel语言.12.Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest
吃透Chisel语言.12.Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest
2022-07-04 12:49:00 【github-3rr0r】
Chisel项目构建、运行和测试(四)——Chisel测试之ChiselTest
上一篇文章我们介绍了ScalaTest,它是Scala和Java的测试工具。而现在Chisel模块最新的标准测试工具是ChiselTest,它是基于ScalaTest的,允许我们用于Chisel测试。为了使用ChiselTest,我们同样需要在build.sbt
里面包含chiseltest
的库:
libraryDependencies += "edu.berkeley.cs" %% "chiseltest" % "0.5.1" % "test"
或者这样:
libraryDependencies ++= Seq(
"edu.berkeley.cs" %% "chisel3" % chiselVersion,
"edu.berkeley.cs" %% "chiseltest" % "0.5.1" % "test"
),
Chisel-template的build.sbt
里面是默认包含了chiseltest
库的,所以我们可以不修改。用这种方法包含ChiselTest会自动包含对应版本的ScalaTest,所以上一篇文章中说的包含ScalaTest也是不需要的。
要使用ChiselTest的话,我们需要导入下面的这些包:
import chisel3._
import chiseltest._
import org.scalatest.flatspec.AnyFlatSpec
对电路进行测试需要包含至少两部分,一个是DUT(待测件),另一个是测试逻辑,也叫testbench。启动测试和ScalaTest是一样的,运行sbt test
命令就行了,不需要有个包含主函数的对象作为程序入口。
下面的代码是一个简单的DUT,它有两个输入端口和一个输出端口,都是二位无符号数信号,实现的功能是对输入a
和b
执行按位与操作,然后把结果输出到out
上:
class DeviceUnderTest extends Module {
val io = IO(new Bundle {
val a = Input(UInt(2.W))
val b = Input(UInt(2.W))
val out = Output(UInt(2.W))
})
io.out := io.a & io.b
}
虽然还没介绍模块的写法,但是这个代码也是很好懂的。现在我们给出这个DUT的testbench,它是从AnyFlatSpec
和ChiselScalatestTester
拓展来的,因此是具有ChiselTest功能的ScalaTest。而调用test()
方法时,以新创建的DUT的一个实例为参数,以测试代码为函数字面量(function literal)。代码如下:
class SimpleTest extends AnyFlatSpec with ChiselScalatestTester {
"DUT" should "pass" in {
test(new DeviceUnderTest) {
dut =>
dut.io.a.poke(0.U)
dut.io.b.poke(1.U)
dut.clock.step()
println("Result is: " + dut.io.out.peek().toString)
dut.io.a.poke(3.U)
dut.io.b.poke(2.U)
dut.clock.step()
println("Result is: " + dut.io.out.peek().toString)
}
}
}
DUT的实例的输入输出端口通过dut.io
来访问。我们可以通过在端口上调用poke
来给端口赋值,它接受的是端口对应的Chisel类型的值。而在输出端口上调用peek
可以把端口的输出给读取出来,返回值也是该端口对应的Chisel类型的值,再在该值上调用toString
可以将其转换为字符串,进而可以调用println()
函数在命令行输出。测试中调用dut.clock.step()
可以让时钟前进一个周期,以此让仿真前进。要是想要前进多个周期,我们可以给step()
提供一个参数。
运行sbt test
或者:
sbt "testOnly SimpleTest"
就可以在终端看到测试的结果:
结果表明,0
和1
按位与的结果为0
,3
和2
按位与的结果为2。当然信息不止有结果,我们还可以看到toString
方法还输出了结果的Chisel类型UInt<2>
,即二位无符号整数。
那我们人工核对输出结果肯定是不好的,但确实已经成功一半了。要想自动完成和预期结果的比较,我们可以通过在输出端口上调用expect(value)
来在testbench中给出预期值,预期值就是expect(value)
的参数value
。修改之后的测试如下:
class SimpleTestExpect extends AnyFlatSpec with ChiselScalatestTester {
"DUT" should "pass" in {
test(new DeviceUnderTest) {
dut =>
dut.io.a.poke(0.U)
dut.io.b.poke(1.U)
dut.clock.step()
dut.io.out.expect(0.U)
dut.io.a.poke(3.U)
dut.io.b.poke(2.U)
dut.clock.step()
dut.io.out.expect(2.U)
}
}
}
现在运行这个测试:
sbt "testOnly SimpleTestExpect"
这个测试不会输出任何来自硬件的结果,它自动在测试内完成了结果与预期值的比较,输出如下:
如果测试失败的话,比如DUT或者testbench里面有错误,导致实际结果和预期值不符,那就回生成一条错误信息来描述两者的差异。比如我们把testbench中最后一行的dut.io.out.expect(2.U)
改成dut.io.out.expect(1.U)
,输出结果就是这样的:
一片红色的报错,同时也给出了测试未通过的理由和具体差异在哪里,在调试的时候这些信息非常有用,所以说测试很重要。
结语
这一篇文章讲了如何用ChiselTest做简单的测试,可以看到很基础,同时也很方便。然而,更精髓的内容还没有体现出来,目前写的测试还没有发挥Scala的强大能力。比如说,上面的测试里面我们都是手动给出测试的输入和输出预期值的,而Scala可以用于写一个参考模型,也就是在另一个系列中说的黄金模型,这样测试就可以更自动化、更全面了。不过我们暂时还不会展开讲,得先把几个测试方法都讲完先,下一篇我们就讲讲用波形进行测试。
边栏推荐
- 硬件基础知识-二极管基础
- E-week finance | Q1 the number of active people in the insurance industry was 86.8867 million, and the licenses of 19 Payment institutions were cancelled
- Animation and transition effects
- Byte interview algorithm question
- Doctoral application | West Lake University Learning and reasoning system laboratory recruits postdoctoral / doctoral / research internship, etc
- 1200. 最小绝对差
- DGraph: 大规模动态图数据集
- [C question set] of VII
- Commvault 和 Oracle 合作,在 Oracle 云上提供 Metallic数据管理即服务
- 高质量软件架构的唯一核心指标
猜你喜欢
Oracle 被 Ventana Research 评为数字创新奖总冠军
How to choose a technology stack for web applications in 2022
基于STM32+华为云IOT设计的酒驾监控系统
MySQL45讲——学习极客时间MySQL实战45讲笔记—— 06 | 全局锁和表锁_给表加个字段怎么有这么多阻碍
一次 Keepalived 高可用的事故,让我重学了一遍它
2022年山东省安全员C证考试题库及在线模拟考试
Automatic filling of database public fields
使用默认路由作为指向Internet的路由
【Antd踩坑】Antd Form 配合Input.Group时出现Form.Item所占据的高度不对
華昊中天沖刺科創板:年虧2.8億擬募資15億 貝達藥業是股東
随机推荐
ViewBinding和DataBinding的理解和区别
MongoDB常用28条查询语句(转)
SCM polling program framework based on linked list management
Five "potential errors" in embedded programming
程序员转方向
Lick the dog until the last one has nothing (state machine)
Getting started with microservices
Byte interview algorithm question
C language Dormitory Management Query Software
FS4059C是5V输入升压充电12.6V1.2A给三节锂电池充电芯片 输入小电流不会拉死,温度60°建议1000-1100MA
Don't turn down, three sentences to clarify the origin of cross domain resource request errors
【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value
Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
Gorm 读写分离(转)
国内酒店交易DDD应用与实践——代码篇
基于链表管理的单片机轮询程序框架
Install Trinity and solve error reporting
WS2811 M是三通道LED驱动控制专用电路彩灯带方案开发
#yyds干货盘点# 解决名企真题:连续最大和
如何在 2022 年为 Web 应用程序选择技术堆栈