如果使用异步组件,是否可以使用“单周期CPU”?

如何解决如果使用异步组件,是否可以使用“单周期CPU”?

我听说过“单周期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计算机一样?

还是我只是说错了?

解决方法

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

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

但它们肯定仍然实现了单周期 CPU 的精神,即每条指令在 1 个时钟周期内运行,没有流水线和多周期微码。

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


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

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

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-