Skip to content

Constantin简介

在处理器调试、性能探索过程中,有一些常数参数需要频繁调整,有一些新实现组件需要和原版比较性能/功能。如果采用修改Chisel RTL并重新编译仿真环境的方法,需要花费20-120分钟时间且容易因各种小错误被打断,迭代效率低。为此,我们开发了Constantin允许常数参数的决定推迟到运行时,从而实现一次RTL编译可仿真多个常数值、多种组件版本、打开不同功能开关的功能。

本工具利用DPI-C在仿真器运行时读取配置文件内的信息获取当前各常量预期值,从而实现运行时改变常量取值。当前机制从技术上也支持在单次仿真过程中改变常量的取指,但尚未找到有效应用场景,如有对应场景,欢迎在香山 repo issue区提出。

使用方法

运行时可变常量值

可以使用Constantin提供的createRecord方法,创建特定名字的常量信号,在相同常量信号被重复创建时,返回的将会是同一常量,受同一配置文件项控制。

val loop_lower_bound = Wire(UInt(64.W))
loop_lower_bound := Constantin.createRecord("lowerbound")

${NOOP_HOME}/build/constantin.txt文件内可以如下格式指明对应常量取值:

lowerbound 10

运行时切换模块版本

可以使用Constantin附带的MuxModule功能辅助createRecord实现运行时动态切换模块。

val predMux = Module(new MuxModule(new BasePredictorIO()(p), 2))
predMux.io.in(1) <> predComposer.io
predMux.io.in(0) <> predFake.io
val predSel = Constantin.createRecord("predSel")
predMux.io.sel := predSel

val predictors = predMux.io.out

MuxModule接受模块端口类型与可选版本数量两个参数,其in端口可接受指明类型的端口,out端口输出选通版本,sel可连接到由createRecord创建的常量从而实现运行时版本的切换。

动态控制开关

运行时可变常量可类型转换为Bool,从而作为一些RTL功能开关的控制信号。