仿真边界处理

在 MINRES 的 SystemC-Components (SCC) ​ 这套轻量级 SystemC/TLM-2.0 生产力库里,pin-level adapter(引脚级适配器) ​ 是和 TLM adapter(事务级适配器) ​ 并列的一类总线边界桥接组件,专门解决「TLM 事务世界 ↔ RTL/Verilated 信号的 sc_signal 世界」之间的语义转换。

它要解决什么问题

现代混合抽象级仿真里常见这种边界:

  • 虚拟平台一侧:CPU/VP/内存控制器走 TLM-2.0 socket ,一次 b_transport / nb_transport 表示一个读写事务,不关心时钟沿。

  • 被集成的 IP 一侧:AXI/APB/AHB 的 Verilated RTL ​ 或手写 cycle-accurate SystemC,端口全是 sc_in/sc_out<sc_bv<>>、sc_clock、READY/VALID/ADDR/DATA/WSTRB 这种逐周期 pin 信号。

两边不能直接连。pin-level adapter 就坐在边界上做双向翻译:

  • TLM → pin :把一次事务拆成若干周期的协议握手,驱动 AW*、AR*、W*、R*、B* 等信号;

  • pin → TLM:采样 RTL 侧信号跳变,在协议握手完成时收拢成一次 TLM generic payload,转发给 TLM 网络。

SCC 里的具体形态

SCC 明确内置了「各种 TLM-2.0 AT 和 pin-level adapters,覆盖 APB、AHB、AXI/ACE、OBI 等常见总线」。

  • 代码位置:仓库 src/ 下带 axi、apb、ahb、obi 等目录,例如 examples/apb-axi 里有 APB pin-level adapter 示例,commit 历史能看到 "adds APB pinlevel adapter" 这类改动。

  • 典型搭配:

    • tlm_target + sc_register + router:纯 TLM 侧资源端点

    • *-pin-adapter / *-tlm-adapter:协议边界

    • Verilated module 的 sc_signal 端口 ←→ pin-level adapter ←→ TLM socket ←→ 其余 VP

  • 抽象级别:pin-level adapter 本身是 cycle-aware​ 的(跟时钟同步、按协议时序产生/采样信号),但对外仍露出 TLM socket,所以平台上层可以继续用 LT/AT 模型,不必关心 RTL 细节。

和 TLM adapter 的区别

维度 TLM adapter (AT/LT) pin-level adapter
两侧接口 TLM socket ↔ TLM socket(或 TLM ↔ sc_register) TLM socket ↔ sc_signal 总线引脚
是否懂时钟 否 / 仅 AT 有粗略时序标注 是,按协议逐周期驱动/采样
主要用途 TLM 模型之间换抽象级、接 router/tlm_target 包 Verilated RTL、RTL IP、cycle-accurate SystemC
SCC 中例子 axi_tlm、ahb_tlm 之类 apb_pin_adapter、axi_pin_adapter 之类

简单说:TLM adapter 在事务层内部转格式,pin-level adapter 把事务层"落地"成波形可见的引脚时序。

典型使用场景

  1. Verilated RTL 进 VP:RTL 用 Verilator 转成 SystemC 模块(全是 signal 端口),用 SCC 的 AXI pin-level adapter 接到 VP 的 TLM 互联上,RTL 当 golden reference 跑软件。

  2. 跨级验证:TLM 模型(如 RISC-V ISS 侧 TLM 内存访问)↔ pin adapter ↔ AXI RTL 核,做 TLM-vs-RTL 一致性比对。

  3. 逐步细化:早期全平台 LT 仿真;某个 IP 换成 RTL 时,只在该 IP 边界加 pin-level adapter,其余 TLM 模型不动。

接入时要注意的点

  • pin-level adapter 引入周期精度开销,比纯 TLM 慢,但比在 C++ 里手搓 AXI 握手逻辑省事且不易错。

  • 时钟和复位要由平台提供并绑到 adapter 的 clk/rstn 上,否则握手不推进。

  • 协议选项(数据位宽、突发支持、OBI 的 prot/we 语义等)通常做成模板参数或构造参数,选错会导致 RTL 侧解码异常。

  • SCC 是 Apache-2.0、C++11 起、依赖 Accellera SystemC + 可选 SCV,adapter 头文件直接 include 即可,不需单独编译成独立 lib(属于 SCC 主体一部分)。

下面把 MINRES SCC 及相关开源库的官方连接、文档站、关键源码/示例路径一次性列清,方便你 clone 和对照 pin-level adapter 看代码。

核心仓库与文档

SCC 内部和 pin-level adapter 相关的路径

clone 后重点看这几个目录:

  • 适配器源码:src/ 下按协议分目录,如 axi/、apb/、ahb/、obi/,pin-level adapter 类通常命名含 pin_adapter 或 pinlevel(如 APB pin-level adapter 在 src/apb/ 附近,AXI/ACE 在 src/axi/)

  • 示例:examples/ace-axi/ace_axi_example、examples/axi-axi/axi_axi_example、examples/apb-axi/(APB pin-level adapter 示例在 commit 历史里有 "adds APB pinlevel adapter" 痕迹)

  • 协议覆盖:APB、AHB、AXI/ACE/ACE-Lite、OBI(target)、OCP(target)、TileLink(UH initiator) 的 TLM AT 与 pin-level adapter 都在库内

配套/相邻开源库(同生态,常一起用)

构建与依赖注意(避免踩坑)

  • 依赖 Accellera SystemC(建议 2.3.4+,编译 SystemC 时 SC_WITH_PHASE_CALLBACK_TRACING=ON),SCC 自身 cmake 可用 conan 或 contrib/install_wo_conan.sh 一键装 SystemC+Boost+SCC。

  • SCC 和 SystemC 必须装到不同 prefix ------SCC 把 C++ namespace 映射成目录,tlm/ 目录会和 SystemC 自带 tlm header 冲突。

  • 典型编译:

    cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<scc_prefix>
    cmake --build build -j16
    cmake --build build --target install
    ./build/examples/ace-axi/ace_axi_example

如果要把 Verilated AXI RTL ​ 接进 SCC 平台,可以按 examples/axi-axi 的骨架,把「TLM initiator → axi_tlm_adapter / axi_pin_adapter → sc_signal<sc_bv<>> → Verilated module」的端口绑定。

相关推荐
北京中科新远科技11 分钟前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
顽疲2 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人4 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)4 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的4 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质5 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
LZ_6665 小时前
php代码执行3(难)
php
释厄6235 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_962885726 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python