用 QEMU 做 SOC 模拟的时候,如何实现频率和时序对齐 #20
Unanswered
zevorn
asked this question in
QEMU | Q&A
Replies: 1 comment
-
|
简单做法,简化指令周期的描述,和频率绑定,比如执行一条指令,你认为时间过去了一个 cycle,然后假设 CPU 频率是 1G,那么 1 / 1G,就是这 1 个 cycle 对应的仿真时间,用这个时间,去驱动定时器。 这样可以保证仿真系统一定的实时性,就是你仿真性能的快和慢,都不影响时序。 我们可以用 qemu 的 QEMU_CLOCK_REALTIME 时钟模式 和 tcg 的 icount 模式来举例: icount 模式:指令计数驱动的时间模拟 您提到的"主定时器方式"正是 QEMU 中 icount(Instruction Count)模式的核心思想。 icount 的工作原理:
我们来看看它的实现方式: // 每条指令推进虚拟时间
int64_t icount_get_executed(void) {
return cpu->icount_decr.u16.low + cpu->icount_extra;
}
// 计算时间增量并驱动定时器
void icount_handle_deadline(void) {
int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
if (deadline < icount_sleep_usec * 1000) {
// 执行指令并推进时间
icount_exec_ops(cpu, deadline);
}
}再看看定时器同步: // 周期性定时器与ICount同步
static void ptimer_tick(void *opaque) {
PTimerState *s = opaque;
s->counter = s->reload;
// 触发中断,与虚拟时间对齐
qemu_irq_raise(s->irq);
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
我有一个有意思的问题,做SOC 模拟的时候,如何实现频率和时序对齐?我之前是实现主定时器的方式来控制的
Beta Was this translation helpful? Give feedback.
All reactions