定向测试(一)
SystemC 写的 TLM 一般指 Transaction-Level Modeling,事务级建模。
它不是在信号级别一根线一根线地描述硬件,而是用更高层的“事务”来描述模块之间的通信。比如不用写:
addr valid ready data write_en byte_en ...
而是直接抽象成一次事务:
read(address)
write(address, data)
或者更正式一点:
tlm_generic_payload trans;
trans.set_command(tlm::TLM_READ_COMMAND);
trans.set_address(0x80000000);
trans.set_data_ptr(buf);
initiator_socket->b_transport(trans, delay);
这里的一次 b_transport 就代表一个总线读/写事务。
SystemC 是语言/库,TLM 是建模抽象层。
关系大概是:
C++
↓
SystemC:用 C++ 写硬件/系统模型,提供 module、port、signal、process、simulation kernel
↓
SystemC TLM:在 SystemC 上用事务级接口建模通信
比如你要建一个 CPU 访问 memory 的模型。
RTL/信号级可能关心:
clk
reset
addr[31:0]
wdata[31:0]
rdata[31:0]
valid
ready
write
byte_enable
burst
resp
TLM 级可以写成:
CPU 发起一个 write transaction 到地址 0x1000,写入数据 0x12345678
Memory 收到 transaction,修改内部数组
它牺牲一部分时序细节,换来更快的仿真速度和更高层的系统建模能力。
常见用途:
SoC 早期架构探索
软件开发/驱动 bring-up
虚拟原型 Virtual Platform
性能建模
和 RTL 联合仿真
UVM testbench 里的高层 reference model
TLM 常见有两个层次:
-
Loosely-timed, LT
只保留大概时间,速度很快。适合软件开发、系统功能验证。
-
Approximately-timed, AT
保留更多阶段时序,比如 request/response、begin/end transaction。比 LT 慢,但更接近总线行为。
典型 SystemC TLM 模块关系:
Initiator Target
CPU ---- transaction ----> Memory
<--- response --------
常用术语:
initiator:发起事务的一方,比如 CPU、DMA
target:接收事务的一方,比如 Memory、Peripheral
socket:TLM 通信端口
payload:事务内容,比如地址、数据、读写类型
transport:传输接口,比如 b_transport / nb_transport
一句话版:
SystemC 写的 TLM,就是用 C++/SystemC 以“读写事务”而不是“逐周期信号”的方式描述硬件系统,用来更快地仿真和验证 SoC/CPU/外设等系统行为。
SAT 是 Boolean Satisfiability Problem,中文一般叫 布尔可满足性问题。
它问的是:
给定一个布尔逻辑公式,是否存在一组变量取值,使整个公式为真?
比如:
(a OR b) AND (NOT a OR c)
SAT 求解器要回答:有没有一种 a, b, c 的真假组合,让它成立。
有的话叫:
SAT / satisfiable / 可满足
没有的话叫:
UNSAT / unsatisfiable / 不可满足
例如:
a AND NOT a
这个永远不可能为真,所以是 UNSAT。
而:
a OR b
只要 a=true 或 b=true,就是 SAT。
在 EDA / 硬件验证里,SAT 很重要,因为很多验证问题最后都可以转成 SAT 或 SMT 问题。
比如你想问:
有没有一种输入序列,会让 assert 失败?
可以被转成:
存在某些输入,使得 bad_state = true 吗?
如果 SAT solver 返回:
SAT
说明存在反例,工具通常能给你一组输入波形,也就是 bug trace。
如果返回:
UNSAT
说明在当前约束和展开深度下,找不到违反条件的情况。
常见应用:
形式验证 formal verification
等价性检查 equivalence checking
模型检测 model checking
约束随机求解 constrained random
综合/优化中的逻辑推理
可以把 SAT solver 理解成一个很强的“逻辑侦探”:
输入:一堆布尔约束
输出:
SAT -> 找到一组满足条件的变量取值
UNSAT -> 证明不存在这样的取值
和普通仿真的区别是:
仿真:
给定输入,看会发生什么
SAT/形式验证:
问工具是否存在某种输入,会导致某种情况
一个硬件例子:
assert (!(grant0 && grant1));
意思是 grant0 和 grant1 不能同时为 1。
形式工具会把电路逻辑、时序展开、约束条件一起转成 SAT 问题,然后问:
是否存在某个时刻 grant0=1 且 grant1=1?
如果可满足,就说明 assertion 可能失败。
如果不可满足,就说明在给定范围/条件下这个错误不会发生。
一句话总结:
SAT 就是在问:这组布尔逻辑约束有没有解。它是很多形式验证、等价检查、模型检测和 EDA 自动化工具背后的核心问题。

浙公网安备 33010602011771号