当前位置:网站首页>吃透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可以用于写一个参考模型,也就是在另一个系列中说的黄金模型,这样测试就可以更自动化、更全面了。不过我们暂时还不会展开讲,得先把几个测试方法都讲完先,下一篇我们就讲讲用波形进行测试。
边栏推荐
- How to choose a technology stack for web applications in 2022
- XML入门二
- remount of the / superblock failed: Permission denied
- C#基础深入学习一
- Introduction to reverse debugging PE structure resource table 07/07
- C語言宿舍管理查詢軟件
- 以房抵债能否排除强制执行
- 2022g3 boiler water treatment examination question simulation examination question bank and simulation examination
- BLOB,TEXT GEOMETRY or JSON column 'xxx' can't have a default value query 问题
- ViewBinding和DataBinding的理解和区别
猜你喜欢

Byte interview algorithm question

HAProxy高可用解决方案

面试官:Redis中哈希数据类型的内部实现方式是什么?

博士申请 | 西湖大学学习与推理系统实验室招收博后/博士/研究实习等

Source code compilation and installation of MySQL

嵌入式编程中五个必探的“潜在错误”

【Antd踩坑】Antd Form 配合Input.Group时出现Form.Item所占据的高度不对

Automatic filling of database public fields

【Antd】Antd 如何在 Form.Item 中有 Input.Gourp 时获取 Input.Gourp 的每一个 Input 的value

一次 Keepalived 高可用的事故,让我重学了一遍它
随机推荐
CommVault cooperates with Oracle to provide metallic data management as a service on Oracle cloud
C language Dormitory Management Query Software
Programmer anxiety
2022 Shandong Province safety officer C certificate examination question bank and online simulation examination
Redis - how to install redis and configuration (how to quickly install redis on ubuntu18.04 and centos7.6 Linux systems)
golang fmt.printf()(转)
Fisher信息量检测对抗样本代码详解
2022g3 boiler water treatment examination question simulation examination question bank and simulation examination
Huahao Zhongtian sprint Technology Innovation Board: perte annuelle de 280 millions de RMB, projet de collecte de fonds de 1,5 milliard de Beida Pharmaceutical est actionnaire
基于STM32+华为云IOT设计的酒驾监控系统
XML入门二
C语言职工管理系统
C语言集合运算
JVM series - stack and heap, method area day1-2
Three schemes to improve the efficiency of MySQL deep paging query
.Net之延迟队列
remount of the / superblock failed: Permission denied
博士申请 | 西湖大学学习与推理系统实验室招收博后/博士/研究实习等
基于链表管理的单片机轮询程序框架
Lick the dog until the last one has nothing (state machine)