ysyx RTL:增加sram与握手信号

news/2025/1/13 22:17:24/文章来源:https://www.cnblogs.com/namezhyp/p/18669459

  在总线章节,我们需要将单周期处理器慢慢转变为多周期处理器。讲义提供了异步总线的思路:master发送valid信号,表示自己当前信号合法,slave发送ready信号,表示当前信号已经收到。达成握手的效果。

  讲义里首先要求增加一个只读取的sram给IFU使用,用于读取指令。这个很好实现,sram元件里只需要 rdata <= pmem_read(raddr)就行。为了复用代码,再加上之后还需要合并,sram元件之后还需要加上更多功能,而IFU这里只连接读取相关的线。

  在增加sram以后就需要考虑信号的问题。我遇到的额外情况是:第一个周期inst还没取到,默认是0,处理器会报错,我的处理方法是时序逻辑里首个周期单独处理,这样就不会出问题。其他情况下:

ifu_valid和idu_ready有效  ---> pc更新,ifu_valid准备无效(因为下个周期要取指,旧指令还没更新)

剩余情况     ---> ifu_valid都可以有效。

  讲义一开始就讲异步握手信号的增加其实不太合理,在单周期改多周期的时候,这些信号其实影响不大。在加入sram,需要等待信号读出时,信号才有了必要。

  对于握手信号,除了讲义上说的,还有一些内容需要补充:

1. 如果一个元件里有时序相关的内容,比如等待sram读取,那么握手信号也要写到时序逻辑里。如果没有,那就应该写到组合逻辑(时序逻辑也行)

2.对于用到了时序逻辑的信号,可以用状态机来帮助整理思路。如果只是一点点撞,那效率真的很低。

3.一个元件的信号不应该透传,比如exu_ready不应该直接赋值给idu_ready。

--------------------- ------------------------------------ -------------

在增加了IFU的sram以后,现在所有指令的执行就分成了两个周期:第一周期IFU发出请求等待取指,第二周期取到指令开始执行。现在需要的就是给EXU也增加一个sram。

EXU这边需要的是一个可读可写的sram,虽然讲义里说ren可以没有,但个人建议最好加上,这样能防止读出不需要的数据,此外可以考虑加上read_valid信号,这样EXU的状态处理会方便一些。

    always @(posedge clk) beginif(ren) beginrdata <= pmem_read(raddr);rvalid <= 1'b1;endelse beginrvalid <= 1'b0;endendalways @(posedge clk) beginif (wen) beginpmem_write(waddr, wdata, wmask);endend

  sram连接以后,就需要考虑exu的信号。exu这边只需要接收idu_valid,输出exu_ready。对于其他指令,EXU只需要一个周期执行,写入sram和写入寄存器都是时序逻辑下个周期完成。对于load类指令则需要两个周期(如果之后加入sram延迟那就需要更多,这也是增加read_valid信号的原因)。  我给exu增加了一个状态位,有IDLE和WAIT_LOAD两个状态。

IDLE状态下,如果此时idu_valid有效且是load类指令,下一个状态就转WAIT,并且exu_ready无效,因为当前周期要读数据,下个周期EXU还要执行

其他情况下,下个周期exu_ready有效并且继续IDLE状态。这是非load指令会发生的情况。

WAIT状态下,如果read_valid(sram的读取成功标志)有效,那么下个周期就回到IDLE,exu_ready也恢复有效。read_valid有效说明sram的数据已经取到了,当前周期执行完,下个周期就可以恢复。

  其他情况下,说明还没取到数据,要继续保持state和exu_ready。  这个状态转移应该可以应对任意延迟了。

 

(也许直接利用exu_ready更简洁一些)

再加上这一段后,load指令对应的就是三个周期,其他指令两个周期。

----------------------------------

  完成这两个元件以后,idu的信号也要处理。idu一方面要接收ifu_valid和exu_ready,另一方面要发出idu_ready和idu_valid。 我的idu没有时序逻辑,那直接idu_valid赋值1就行。但是idu_ready需要在exu_ready有效并且是load指令时无效( exu_ready有效是因为时序信号慢一拍)。如果不确定自己的设计,可以用波形配合verilog的打印来查看,效果很好。

  虽然讲义建议使用difftest等功能来debug,但是有需要的时候也可以考虑直接看波形。在一开始的c++仿真代码里就添加了采集波形的功能,直接用gtkwave就能打开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868736.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我反向操作鸽掉腾讯音乐,只因为觉的...

大家好,我是土哥。 之前有位同学,在土哥的辅导下,居然飘了,当腾讯酷我音乐 HR 看完他的简历后,想邀约他面试,他直接一口回绝了。给的理由如下:目前只想面腾讯 QQ 音乐或者腾讯内部的岗位大厂流程已经到 offer 审核阶段了基于上述两个条件,所以暂时放弃面试。 当土哥看到…

leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表

四、题目之:代码随想录 https://programmercarl.com/ (1) 代码随想录:数组 704. 二分查找 class Solution {public int search(int[] nums, int target) {if(target<nums[0] || target>nums[nums.length-1]){return -1;}int left = 0,right = nums.length-1;while(lef…

本以为PDD挂了,结果开了50万SSP

大家好,我是土哥。 2024 届校招已然落下帷幕,互联网大厂为将优秀人才招致麾下,纷纷使出浑身解数。在薪资待遇方面,更是各有千秋 。 这里给大家分享一位2024届求职的小伙伴,PDD 非技术岗拿到 50w 的 SSP offer~ 我盆友圈的一个粉丝,之前和土哥交流,说她投递的PDD 上海岗位…

Win32汇编学习笔记11.游戏辅助的实现

Win32汇编学习笔记11.游戏辅助的实现-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 游戏基址 游戏基址的概念游戏基址是保持恒定的两部分内存地址的一部分并提供一个基准点,从这里可以计算一个字节数据的位置。基址伴随着一个加到基上的偏移值来确定信息准…

黑狂野大数据2

--拉链表 --增量导入是没有overwrite 且加载的是最新分区的数据

others_shellcode 1

其实这题直接nc连一下就可以了。其实考的是系统调用来着 32位程序系统调用号用 eax 储存, 第一 、 二 、 三参数分别在 ebx 、ecx 、edx中储存。 可以用 int 80 汇编指令调用。 64位程序系统调用号用 rax 储存, 第一 、 二 、 三参数分别在 rdi 、rsi 、rdx中储存。 可以用 sys…

一篇解决编译原理大作业,基于Flex、Bison设计编译器(含语法分析树和符号表)

1.工具简单介绍 Flex 和 Bison 是编译器开发中常用的两个工具,分别用于生成词法分析器和语法分析器。它们通常一起使用,共同完成源代码的词法分析和语法分析工作。 Flex: Flex通过读取一个规则文件(通常是.l文件),这个文件中定义了一系列的模式和对应的动作。模式用于匹配…

python 删除txt的前三行并保存原文件

数据 #!usr/bin/env python # -*- coding:utf-8 _*- """@author:Suyue @file:raindrop.py @time:2025/01/$ {DAY} @desc: """ def remove_first_three_lines(file_path):# 读取原始文件的所有行with open(file_path, r, encoding=utf-8) as file…

P3586 [POI2015] Logistyka

P3586 [POI2015] Logistyka 题目描述 维护一个长度为 \(n\) 的序列,一开始都是 \(0\),支持以下两种操作:U k a 将序列中第 \(k\) 个数修改为 \(a\)。 Z c s 在这个序列上,每次选出 \(c\) 个正数,并将它们都减去 \(1\),询问能否进行 \(s\) 次操作。每次询问独立,即每次询…

Java编程规范-命名规范

命名风格 抽象类/异常类/测试类 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。 数组 中括号是数组类型的一部分,数组定义如下:String[] args。 反例: 使用 String args[] 的方式来定义。 POJO…

go序列化库--msgpack

简介 msgpack是一个基于二进制高效的对象序列化类库,可用于跨语言通信。 它可以像JSON那样,在许多种语言之间交换结构对象。 但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Go等众多语言。 宣称比Google Protocol Buffers还要快4倍。官方的说法它像 JSON, 但…