mips - 如果使用异步组件,是否可能出现 "single cycle cpu"?

标签 mips cpu hardware cpu-architecture retro-computing

我听说过“单周期 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 的一个私有(private)群组中)
======
更新:查看简单的 MIP,似乎模型使用同步内存,因此可能可以在单个边缘广告上运行 - 因此保证类别“单周期”。
也许 FPGA 内存总是同步的——我不知道。
但是该术语是否在其他地方使用不一致 - 即像大多数 Homebrew TTL 计算机一样??
还是我完全错了?
====
更新 :
有些人可能误解了我的意思。
许多自制的 TTL cpu 声称“单周期 CPU”状态(对于进行流水线或其他操作的更复杂的野兽的讨论目的,不感兴趣)。
通过单周期这些 CPU,它们通常意味着它们会在时钟的一个边沿上推进 PC,然后使用时钟的相反边沿用结果更新触发器。或者他们将使用时钟的另一个相位来更新诸如锁存器和 sram 之类的异步组件。
但是,我提供的 ZipCPU 引用建议使用相反的时钟边沿类似于使用第二个时钟周期甚至第二个时钟。顺便说一句,Ben Eater 在他的视频中甚至将他用来更新 SRAM 的倒置时钟比作第二个时钟。
我反对在此类 CPU 上使用“单周期 CPU”(基本上我见过的大多数/所有国产 TTL CPU,因为它们都以这种方式工作)是我同意 ZipCPU 使用相反的边缘(或相位)提交的时钟实际上与使用第二个时钟相同,这是对“单周期”声明的 mock 。
如果使用对边实际上与使用单边但使用双时钟周期相同,那么我认为使用该术语是有问题的。所以我把 ZipCPU 的观点牢记在心,并收紧了这个术语,以表示使用单边。
另一方面,似乎完全有可能构建一个只使用同步组件(即边沿触发触发器)并且只使用一个边沿的 CPU,在每个边沿上,我们将总线上的任何内容计时到所选的任何设备中写入并同时推进PC。
在一个边缘和下一个相同方向的边缘之间,发生沉降。
以这种方式,我们最终得到 CPI=1 并且只使用一个边沿 - 这与使用时钟两个边沿的常见 TTL CPU 模式非常明显不同。
顺便说一句,我对 FPGA 的印象(我在这里不是指)是 FPGA 中的存储元件都是同步触发器。我不知道,但这就是我的阅读建议。无论如何,如果这是真的,那么一个基于 FPGA 的普通 CPU 可能有一个 CPI=1 并且只使用 +ve 边缘,所以这些很可能满足我对“单周期 CPU”的狭隘定义。此外,我的阅读表明,各种 MIP 的实现(可能是教育工作)可能符合我的定义。

最佳答案

这似乎主要是定义和术语的问题,而不是如何实际构建简单的 CPU。
如果您坚持“单周期 CPU”的严格定义意味着真正仅使用时钟边沿来设置该指令的所有内容,那么是的,这将排除使用第二个时钟边沿的真实世界的玩具/爱好 CPU内存访问的一致间隔。
但它们肯定还是实现了单周期 CPU 的精神,即每条指令在 1 个时钟周期内运行,没有流水线,没有多周期微码。
一个完整的时钟周期确实有 2 个时钟边沿,现实世界(非单周期)CPU 在某些情况下使用“另一个”边沿进行内部计时是很正常的,但我们仍然在整个周期中讨论它们的频率,不是边缘频率,除非在像 DDR 内存这样的情况下,我们确实谈论传输速率 = 两倍的内存时钟频率。使之与众不同的是始终使用两个边缘,并且对于大致相同的事物,而不仅仅是时钟周期内的一些额外计时/同步。

现在,您能否构建一个 CPU,在不使用时钟沿的情况下,将存储值保存在内存总线上的最短时间?也许。
也许确保通往存储数据的关键路径足够短,以便数据始终准备就绪。并且可能会随着您的计算(或仅从任何指令的最长关键路径)传播一些“数据就绪”信号,并且在数据在总线上之后的几个门延迟之后,翻转内存时钟。 (并在下一个 CPU 时钟边缘,将其翻转回来)。如果您的内存不介意其时钟没有统一的占空比,那么只要内存时钟的每一半都足够长,这可能没问题。
对于从内存加载,您可以通过在启动单周期 CPU 的这个“周期”的 CPU 时钟边缘之后的一些门延迟启动内存加载周期来做类似的事情。这甚至可能涉及使用专用于该目的的逆变器有意构建一长串门延迟。或者甚至可能是模拟 RC 时间延迟,但无论哪种方式,这显然都比仅使用主时钟的另一个边沿更糟糕,而且您只能将其作为单周期教条纯度的练习。 (它也可能是片状的,因为门延迟不是恒定的,取决于电压和温度,所以芯片的一侧比另一侧运行得更热可能会改变相对时序。)

关于mips - 如果使用异步组件,是否可能出现 "single cycle cpu"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63693436/

相关文章:

assembly - 在MIPS中,何时使用有符号扩展,何时使用零扩展?

c - C中的CPU数量限制

java - Java中如何获取处理器组的数量?

x86 - L1高速缓存 Controller 的顺序以处理来自CPU的内存请求

hardware - 处理器在等待主内存获取时做什么

assembly - 高内存地址与低内存地址和分支

交叉编译找不到lib

assembly - 用于简单 for 循环的 MIPS 程序集

assembly - 调用堆栈究竟是如何工作的?

verilog - 使用 DPI 将任务导出到 'C