【发布时间】:2020-12-20 21:48:51
【问题描述】:
我听说过“单周期 CPU”这个词,并试图理解单周期 CPU 的真正含义。是否有明确一致的定义和共识以及是什么意思?
我遇到的一些自制“单周期 CPU”似乎同时使用时钟的上升沿和下降沿来完成一条指令。通常,上升沿用作获取/解码,下降沿用作执行。
但是,在我的阅读中,我发现了这里提出的合理观点......
https://zipcpu.com/blog/2017/08/21/rules-for-newbies.html
"Do not transition on any negative (falling) edges.
Falling edge clocks should be considered a violation of the one clock principle,
as they act like separate clocks.".
这对我来说听起来很真实。
同时需要上升沿和下降沿(或高相位和低相位)实际上与需要以两倍速度运行的单个时钟的两个周期的上升沿相同;这将是一个“双周期”CPU,不是吗。
那么,当上升沿和下降沿都被主动用于状态更改时,可以诚实地说设计是“单周期 CPU”吗?
看起来真正的单周期 cpu 必须在 单时钟周期的单时钟边沿上执行所有状态更改操作。
如果数据存储都是同步的,我可以想象这样的事情是可能的。如果我们有一个已经稳定的同步系统,那么在下一个时钟沿,我们可以将结果计时到同步数据存储中,同时将程序计数器计时到下一个地址。
但是,如果目标数据存储例如是异步 RAM,那么在存储数据时控制线肯定会发生变化,从而导致意外行为。
我错了吗,是否有任何包含异步存储的“单周期 CPU”示例?
在一个设计中使用异步 RAM 似乎意味着必须使用至少两个逻辑时钟周期来实现状态更改。
当然,如果更复杂一些,也许可以添加一个使用单边的 CPU,其中指令仅使用同步输出组件,但在存储到异步数据时依赖额外的周期;但那仍然不是单周期 cpu,而是一个大部分单周期 cpu。
因此,任何写入异步 RAM(或其他异步组件)的 CPU 都不能真正被视为单周期 CPU,因为整个指令不能在单个时钟沿执行。 RAM 写入需要两个边沿(即下降沿和上升沿),这打破了单时钟原则。
那么是否存在普遍接受的单周期 CPU,我们是否一致地应用该术语?
故事是什么?
(也发布在我的 hackday 日志 https://hackaday.io/project/166922-spam-1-8-bit-cpu/log/181036-single-cycle-cpu-confusion 以及 hackaday 的私人群组中)
=====
更新:从简单的 MIP 来看,模型似乎使用同步内存,因此可能会在单个边缘广告上运行,也许确实如此 - 因此保证“单周期”类别。 也许 FPGA 内存总是同步的——我不知道。
但是该术语在其他地方的使用不一致 - 即像大多数 Homebrew TTL 计算机一样吗??
还是我完全错了?
====
更新:
有些人可能误解了我的意思。
许多自制的 TTL cpu 声称“单周期 CPU”状态(出于本讨论的目的,对执行流水线或其他操作的更复杂的野兽不感兴趣)。
这些 CPU 的单周期通常意味着它们会执行一些操作,例如在时钟的一个边沿上推进 PC,然后使用时钟的相反边沿来更新触发器的结果。或者他们将使用时钟的另一个阶段来更新锁存器和 sram 等异步组件。
但是,我提供的 ZipCPU 参考建议使用相反的时钟沿类似于使用第二个时钟周期甚至第二个时钟。顺便说一句,Ben Eater 在他的视频中甚至将他用来更新 SRAM 的倒置时钟比作第二个时钟。
我反对将“单周期 CPU”与此类 CPU(基本上我见过的大多数/所有家庭培育的 TTL CPU,因为它们都以这种方式工作)一起使用,是因为我同意 ZipCPU 使用相反的边缘(或提交时钟的相位)实际上与使用第二个时钟相同,这对“单周期”声明是一种嘲弄。
如果对边的使用实际上与使用单边但使用双时钟周期相同,那么我认为使用该术语是有问题的。所以我把 ZipCPU 的观点牢记在心,并把这个词收紧为使用单一边缘。
另一方面,似乎完全有可能构建一个仅使用同步组件(即边沿触发触发器)且仅使用单个边沿的 CPU,在每个边沿上,我们将总线上的任何内容计时到任何设备中选择写入并同时推进 PC。 在一个边缘和下一个相同方向的边缘之间,会发生沉降。
以这种方式,我们最终得到 CPI=1 并且仅使用单个边沿 - 这与使用时钟两个边沿的常见 TTL CPU 模式截然不同。
顺便说一句,我对 FPGA 的印象(我在这里没有提到)是 FPGA 中的存储元件都是同步触发器。我不知道,但这就是我的阅读所暗示的。无论如何,如果这是真的,那么基于 FPGA 的普通 CPU 可能具有 CPI=1 并且仅使用 +ve 边缘,因此这些很可能符合我对“单周期 CPU”的狭义定义。此外,我的阅读表明各种 MIP 的 impl(可能是教育努力)可能符合我的定义。
【问题讨论】:
-
逻辑开始在时钟边沿,但随着时间的推移通过门延迟以取决于每个门的电气细节和线延迟的速度向前波动。并在下一个时钟周期开始之前完成,即使在最坏的情况下(关键路径)也是如此。您的措辞“必须在单个时钟周期的单个时钟边沿上执行所有状态更改操作。”并未考虑门延迟,但您的下一段确实谈到了它(“解决") 很明显,我只是在吹毛求疵。也许是“开始”而不是“执行”?我不是逻辑术语方面的专家,所以也许没关系。
-
无论如何,我能看到在没有时钟沿的情况下获得任何有保证的稳定间隔的唯一方法是控制门延迟,比如故意使用已知的长链门延迟来触发一个内存写入,该链比数据输入的关键路径长。但这似乎非常不稳定,因为门延迟不是恒定的,并且芯片的一侧比另一侧运行得更热可能会改变相对时序。我不知道这是否是一个答案,但是是的,您的担忧似乎是有效的。
-
注意我说的是“单个时钟”-边缘不是“没有时钟边缘”。使用门延迟为像 sram 这样的异步组件重新创建写入脉冲并不比使用单独的时钟来执行此操作或使用多个时钟周期来实现写入更好。这些是为什么我不接受对家用 brew CPU 使用术语“单周期 cpu”的示例;因为如果使用异步组件(与翻转流和同步内存相反)似乎不可避免,那么就无法在单个时钟周期内仅使用单个边沿进行有用的工作。
-
是的,当然,您只会在实际设计中使用另一个时钟沿,除非您有意尝试保持“单周期”CPU 设计的哲学纯粹性,但仍要驱动信号到另一个时钟总线。不过,我对 DRAM“异步”的原因并不十分熟悉。你不能在数据准备好时开始 RAM 写入(通过断言某个引脚或发送内存时钟边沿),并在下一个适当的 CPU 时钟上结束写入吗?只要保持导致 RAM 的门延迟足够低,就可以确保内存“时钟”间隔足够长。
-
单周期 CPU 可以在单个时钟周期内完全执行从获取到提交的任何指令。如果把总工作分成两个半周期就可以了; CPU仍然是单周期的。所以总的工作不一定要在一条边上进行,因为一个循环包含两条边,而不仅仅是一条边,在两条边上划分工作就可以了。现在,如果你将同一个单周期 CPU 的频率加倍,那么一个周期的定义就会改变,它就不再是单周期 CPU。
标签: mips cpu hardware cpu-architecture retro-computing