2

我听说过“单周期 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,我们是否一致地应用该术语?

来龙去脉是什么?

(也发布在我的 hackaday 日志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 的 impls(可能是教育努力)可能符合我的定义。

4

2 回答 2

2

这似乎主要是定义和术语的问题,而不是如何实际构建简单的 CPU。

如果您坚持“单周期 CPU”的严格定义,即真正仅使用时钟边沿来设置该指令的所有动作,那么是的,这将排除使用第二个时钟边沿的现实世界玩具/爱好 CPU 给内存访问的一致间隔。

但它们当然仍然符合单周期 CPU 的精神,即每条指令在 1 个时钟周期内运行,没有流水线,也没有多周期微码。

一个完整的时钟周期确实有 2 个时钟边沿,在某些情况下,现实世界(非单周期)CPU 使用“其他”边沿进行内部时序是正常的,但我们仍然在整个周期中讨论它们的频率,不是边缘频率,除非在 DDR 内存这样的情况下,我们确实谈论传输速率 = 内存时钟频率的两倍。与众不同的是始终使用两个边沿,并且对于大致相等的事情,而不仅仅是时钟周期内的一些额外定时/同步。


现在,您能否构建一个 CPU,在不使用时钟沿的情况下,在内存总线上保留存储值一段最短时间?也许。

也许确保导致存储数据的关键路径足够短,以使数据始终准备就绪。并且可能会随着您的计算(或仅从任何指令的最长关键路径)传播一些“数据就绪”信号,并且在数据到达总线后经过几个门延迟后,翻转内存时钟。(并在下一个 CPU 时钟沿,将其翻转回来)。如果您的内存不介意其时钟没有统一的占空比,那么只要内存时钟的每一半都足够长,这可能会很好。

对于从内存加载,您可以通过在启动单周期 CPU 的这个“周期”的 CPU 时钟沿之后启动内存加载周期一些门延迟来做类似的事情。这甚至可能涉及使用专用于该目的的反相器故意构建一长串门延迟。或者甚至可能是模拟 RC 时间延迟,但无论哪种方式显然都比仅使用主时钟的另一个边缘更糟糕,而且您只能将其作为单周期教条纯度的练习。(它也可能是片状的,因为栅极延迟不是恒定的,取决于电压和温度,因此芯片的一侧比另一侧运行得更热可能会改变相对时序。)

于 2021-01-18T21:12:16.357 回答
0

定义说单周期 CPU 每一个周期只需要一条指令。因此,理论上可以得出结论,即有其他 CPU 每个周期需要或多或少的指令。您可以查看一下,其中有一些概念,例如多周期处理器和流水线处理器(指令流水线)。“流水线试图通过将传入指令分成一系列顺序步骤来使处理器的每个部分都忙于处理某些指令。” 根据维基。我不知道它究竟是如何工作的,但也许它只是使用可用的寄存器(也许不是使用例如 EAX,而是像 EAX 一样使用 ECX,或者它可能以其他方式工作,但可以肯定的是 100% 正确的数量注册在增加,所以也许这是主要目的之一。来源:https://en.wikipedia.org/wiki/Instruction_pipelining 我认为问题的答案:“is-a-single-cycle-cpu-possible-if-asynchronous-components-are-used”取决于控制的 CPU 控制器CPU 和 RAM 都带有操作码。我在网站上找到了有关此的有趣信息:http: //people.cs.pitt.edu/~cho/cs1541/current/handouts/lect-pipe_4up.pdf https://ibb.co/tKy6sR2 结论:在我看来,如果我们考虑“单周期 CPU”这个术语,它应该是最简单的构造。术语“异步”实现了一个比“同步”更复杂的结论。所以这两个术语是不等价的。类似于“可以将基本数据类型视为结构吗?”。在我看来,“单一”这个词意味着最简单的可能,“异步”意味着一些修改,所以更复杂,所以认为这是不可能的,但也许“被使用”这个词可以被“当时使用”绕过- 如果有一些开关,一些控制器可以关闭异步模式并使这一切变得尽可能简单。但一般只是认为这是不可能的

于 2021-01-18T18:16:15.863 回答