在做RTL仿真验证时,覆盖率收集往往是我们在验证中需要注意的地方,本篇就SpinalHDL中的验证覆盖率收集做一个简单说明。
sbt配置
在SpinalHDL里进行仿真验证时,我们的待测试代码会生成Verilog/Systemverilog电路交由Verilator进行仿真,而激励则由scala本身提供,两者之间通过verilator的VPI进行通信交流。SpinalHDL覆盖率的收集在SpinalHDL 1.4.2中开始支持,在我们通过sbt构建项目时,build.sbt的依赖项配置如下:
name := "scalaTest"
version := "0.1"
scalaVersion := "2.11.12"
fork := true
val spinalVersion = "1.4.2"
libraryDependencies ++= Seq(
"com.github.spinalhdl" % "spinalhdl-core_2.11" % spinalVersion,
"com.github.spinalhdl" % "spinalhdl-lib_2.11" % spinalVersion,
compilerPlugin("com.github.spinalhdl" % "spinalhdl-idsl-plugin_2.11" % spinalVersion))
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.8" % "test"
开启覆盖率收集功能
有注意上文所给例子的小伙伴或许已经注意到,我们已经开启了覆盖率收集:
val dut=SimConfig.withWave.withCoverage.compile(addSimEnv(10,8))
SpinalHDL通过指定withCoverage选项来开启覆盖率收集。在《SpinalHDL—基于Scala的测试框架》一文中我们拍完仿真测试用例后在相应目录下每个teseCase会生成一个.dat文件:
我们一共跑了五个testCase,因而生成了五个.dat文件。
生成html报告
由于Verilator生成的.dat文件无法直观阅读,这里我们需要将.dat文件合并并生成html文件。这里需要安装lcov。
#合并覆盖率.dat文件为一个coverage.dat
verilator_coverage -write coverage.dat test.dat test_1.dat test_2.dat test_3.dat test_4.dat
#生成coverage.info
verilator_coverage -write-info coverage.info coverage.dat
#生成 html覆盖率报告
genhtml coverage.info --output-directory coverage
最终会生成一个coverage的文件夹:
打开index.html文件即可看到代码覆盖率:
作者:玉骐
原文链接:Spinal FPGA
微信公众号:
推荐阅读
更多SpinalHDL技术干货请关注[Spinal FPGA]欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。