• SpinalHDL之实用工具(下篇)


    本文作为SpinalHDL学习笔记第十四篇,记录使用SpinalHDL的一些实用性语法工具。

    SpinalHDL学习笔记总纲链接如下:

    SpinalHDL 学习笔记_spinalhdl blackbox-CSDN博客

    目录:

    6.存根(Stub)

    7.Assertions

    8.Report

    9.ScopeProperty

    6.存根(Stub)

    可以将组件层次结构清空作为一个存根(stub):

    1. class SubSysModule extends Component {
    2. val io = new Bundle {
    3. val dx = slave(Stream(Bits(32 bits)))
    4. val dy = master(Stream(Bits(32 bits)))
    5. }
    6. io.dy <-< io.dx
    7. }
    8. class TopLevel extends Component {
    9. val dut = new SubSysModule().stub //instance an SubSysModule as empty stub
    10. }

     例如,它将生成以下 Verilog 代码:

    1. module SubSysModule (
    2. input io_dx_valid,
    3. output io_dx_ready,
    4. input [31:0] io_dx_payload,
    5. output io_dy_valid,
    6. input io_dy_ready,
    7. output [31:0] io_dy_payload,
    8. input clk,
    9. input reset
    10. );
    11. assign io_dx_ready = 1'b0;
    12. assign io_dy_valid = 1'b0;
    13. assign io_dy_payload = 32'h0;
    14. endmodule

    还可以清空顶部组件:

    SpinalVerilog(new Pinsec(500 MHz).stub)

    stub 有什么作用?

    • 首先遍历所有组件并找出时钟,然后保留时钟

    • 然后删除所有子组件

    • 然后删除我们不需要的所有赋值和逻辑

    • 给输出端口赋值 0

    7.Assertions

    除了 Scala 运行时断言之外,还可以使用以下语法添加硬件断言:

    assert(assertion : Bool, message : String = null, severity: AssertNodeSeverity = Error)

    严重性等级是:

    名称

    描述

    NOTE

    用于报告提示性消息

    WARNING

    用于报告异常情况

    ERROR

    用于报告不应该发生的情况

    FAILURE

    用于报告致命情况并关闭仿真

    一个实际的例子是检查当 ready 为低电平时,握手协议的 valid 信号不应该由高变低:

    1. class TopLevel extends Component {
    2. val valid = RegInit(False)
    3. val ready = in Bool()
    4. when(ready) {
    5. valid := False
    6. }
    7. // some logic
    8. assert(
    9. assertion = !(valid.fall && !ready),
    10. message = "Valid dropped when ready was low",
    11. severity = ERROR
    12. )
    13. }

    8.Report

    可以使用以下语法在 RTL 中添加调试以进行仿真:

    1. object Enum extends SpinalEnum{
    2. val MIAOU, RAWRR = newElement()
    3. }
    4. class TopLevel extends Component {
    5. val a = Enum.RAWRR()
    6. val b = U(0x42)
    7. val c = out(Enum.RAWRR())
    8. val d = out (U(0x42))
    9. report(Seq("miaou ", a, b, c, d))
    10. }

    例如,它将生成以下 Verilog 代码:

    $display("NOTE miaou %s%x%s%x", a_string, b, c_string, d);

    从 SpinalHDL 1.4.4 开始,还支持以下语法:

    report(L"miaou $a $b $c $d")

    可以使用 REPORT_TIME 对象显示当前仿真时间:

    report(L"miaou $REPORT_TIME")

    会导致:

    $display("NOTE miaou %t", $time);

    9.ScopeProperty

    范围属性是可以在当前线程本地存储值的东西。它的 API 可用于设置/获取该值,还可以以堆栈方式对部分值进行修改。

    换句话说,它是全局变量、 scala 隐式变量、线程本地变量(ThreadLocal)的替代品。

    • 与全局变量相比,它允许运行多个线程独立运行相同的代码

    • 与 scala 隐式变量相比,它与代码库的耦合较小

    • 与线程本地变量(ThreadLocal)相比,它有一些 API 可以收集所有范围属性并稍后将它们恢复到相

    同状态

    1. object Xlen extends ScopeProperty[Int]
    2. object ScopePropertyMiaou extends App {
    3. Xlen.set(1)
    4. println(Xlen.get) //1
    5. Xlen(2) {
    6. println(Xlen.get) //2
    7. Xlen(3) {
    8. println(Xlen.get) //3
    9. Xlen.set(4)
    10. println(Xlen.get) //4
    11. }
    12. println(Xlen.get) //2
    13. }
    14. }

  • 相关阅读:
    手把手教你用站长工具综查询网站域名在各个平台的权重情况 站长工具综查询
    2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析
    servlet交互过程图详解,servlet的常见问题,创建web项目(一)
    洗袜子的洗衣机哪款好?高性价比小型洗衣机测评
    Xilinx FPGA管脚约束语法规则(UCF和XDC文件)
    从代码逻辑到场景实战,百度高级工程师带你解密PP-ChatOCR!
    css实现流星划过动画
    计算机网络分层结构
    10驾校科目一考试系统——窗口交互
    【知识蒸馏】使用CoatNet蒸馏ResNet图像分类模型
  • 原文地址:https://blog.csdn.net/m0_59092412/article/details/140375653