【问题标题】:Is a "single cycle cpu" possible if asynchronous components are used?如果使用异步组件,是否可以使用“单周期 CPU”?
【发布时间】: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


【解决方案1】:

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

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

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

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


现在可以构建一个 CPU,在不使用时钟边沿的情况下在内存总线上保持存储值一段最短时间吗?也许吧。

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

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

【讨论】:

  • IDK 如果这是一个有用的答案,但我不希望你的赏金在没有你从中得到什么的情况下结束。所以我将我的 cmets 修改为这个答案。再次,IDK,如果这是你想要的答案。但是 TL:DR: 不要担心这个。
【解决方案2】:

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

【讨论】:

  • OP 使用“异步”来谈论具有时钟接口的 RAM,而不是仅仅在一些门延迟(如 SRAM)后放入地址和输出数据。 IDK 如果异步甚至是它的正确术语,但您的类比是“可以将基本数据类型视为结构吗?”似乎一点用都没有。这不是要让整个 CPU 不计时。
  • 另外,关于流水线和微编码 CPU 存在的整个前半部分并不相关。这就像通过指出汽车和火车的存在来回答有关设计摩托车的问题。但如果您好奇,请参阅 Modern Microprocessors A 90-Minute Guide!realworldtech.com/sandy-bridge 以深入了解复杂的现代管道(超标量/无序,具有用于重命名架构寄存器的大型物理寄存器文件)跨度>
  • 哇酷 - 只是对高级结构有一些简单的了解 - 添加这个答案是因为想开始讨论 CPU 架构 - 这对我来说非常有趣。我还寻找有关映射具有未知行为的硬件的相关主题 - 例如映射具有已擦除名称的微控制器的行为。一般来说 - 一个大问题 - 我们如何知道英特尔提供的文档对于所有 CPU 行为是否 100% 真实?可能操作码的含义和它描述的不一样——只需要有人像 mov edi、edi 这样的非理性操作码一样谈论它
  • mov edi,edi 是一种将 EDI 零扩展到 RDI 的完全正常的方法。但要实际搜索未记录的操作码,请参阅Breaking the x86 instruction set (conference presentation vid) / news.ycombinator.com/item?id=15209632。基本上,将字节放在未映射页面的末尾,看看你是否得到#UD非法指令错误或#PF页面错误,因为它在执行后试图获取下一页。或者,如果这些字节只是较长指令的一部分。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2017-07-19
  • 2012-01-01
  • 2016-03-04
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多