【RISC-V设计-08】- RISC-V处理器设计K0A之BMU

news/2024/9/10 7:07:53/ 标签: risc-v

【RISC-V设计-08】- RISC-V处理器设计K0A之BMU

文章目录

  • 【RISC-V设计-08】- RISC-V处理器设计K0A之BMU
    • 1.简介
    • 2.顶层设计
    • 3.端口说明
    • 4.总线时序
      • 4.1 总线写时序
      • 4.2 总线读时序
    • 5.代码设计
    • 6.总结

1.简介

总线管理单元(Bus Management Unit,简称 BMU)是 CPU 中负责取指以及数据加载与存储的模块。其主要涵盖两个功能:其一为指令获取,当 CPU 开始运行,BMU 模块会依据程序计数器 PC,依序逐步加载指令,随后交付给译码、执行单元处理。其二是数据的加载与存储,当执行到加载指令时,按照译码、执行单元的指示,向总线发起读请求,所读取到的数据会返回至通用寄存器组;而在执行到数据的存储指令时,同样依据译码、执行单元的指示,向总线发起写请求。在 BMU 的设计当中,数据的加载与存储具备高优先级,而指令的获取则具有低优先级。

2.顶层设计

3.端口说明

序号端口位宽方向说明
1core_clk1input内核时钟
2core_rstn1input内核复位信号,低有效
3bus_avalid1output总线的地址有效信号
4bus_aready1input总线的地址就绪信号
5bus_write1output总线的写使能信号
6bus_addr18output总线地址
7bus_strb4output总线写字节有效信号
8bus_wdata32output总线写数据
9bus_rvalid1input总线读有效信号
10bus_rready1output总线读就绪信号
11bus_rdata32input总线读数据
12idu2bmu_pc_set1input程序计数器设置
13idu2bmu_pc_new18input新的程序计数器
14bmu2idu_pc_ack1output程序计数器应答
15idu2bmu_ls_req1input加载与存储请求
16idu2bmu_ls_cmd1input加载与存储命令,1写0读
17idu2bmu_ls_size2input加载与存储写数据字节数
18idu2bmu_ls_addr20input加载与存储的地址
19idu2bmu_ls_wdata32input加载与存储的写数据
20bmu2idu_ls_rdata32output加载与存储的读数据
21bmu2idu_valid1output指令有效指示
22bmu2idu_instr32output需要执行的指令
23bmu2idu_pc_cur18output当前指令的PC
24bmu2idu_pc_nxt18output下一条指令的PC

4.总线时序

此总线分为两个通道,分别是主机向丛机传输的地址和写数据通道,丛机向数据传输的读数据通道。两个通道均采用双向握手机制,在valid和ready同时为高时,通道内数据(包含地址、控制信号)传输完成。

4.1 总线写时序

在上图中,第一次传输为单次写操作,数据、地址同时发出,bus_avalid和bus_aready同时为高时,写数据传输完成。第二次传输时,bus_aready为低,在等到bus_aready为高时,写数据传输完成。第三次传输为连续写操作。第四次传输由于bus_aready为低,之后主机并未保持传输,而是切换为第五次传输,所有第四次传输被取消,数据D4不会被写入。

4.2 总线读时序

在上图中,第一次传输为单次读操作,地址发出后,bus_avalid和bus_aready同时为高时,读地址被接受,同时开始数据传输,在遇到bus_rvalid和bus_rready同时为高时,数据传输完成。第二次传输时,bus_aready为低,在等到bus_aready为高时,读地址被接受。第三次传输为连续读操作。第四次传输由于bus_aready为低,之后主机并未保持传输,而是切换为第五次传输,所有第四次传输被取消,数据D4不会被读出。

5.代码设计

// -------------------------------------------------------------------------------------------------
// Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
// Description :
//             1. Bus Management Unit
// -------------------------------------------------------------------------------------------------module k0a_core_bmu (input  wire         core_clk         ,input  wire         core_rstn        ,output reg          bus_avalid       ,input  wire         bus_aready       ,output wire         bus_write        ,output wire [17:0]  bus_addr         ,output wire [3:0]   bus_strb         ,output wire [31:0]  bus_wdata        ,input  wire         bus_rvalid       ,output wire         bus_rready       ,input  wire [31:0]  bus_rdata        ,input  wire         idu2bmu_pc_set   ,input  wire [17:0]  idu2bmu_pc_new   ,output wire         bmu2idu_pc_ack   ,input  wire         idu2bmu_ls_req   ,input  wire         idu2bmu_ls_cmd   ,input  wire [1:0]   idu2bmu_ls_size  ,input  wire [19:0]  idu2bmu_ls_addr  ,input  wire [31:0]  idu2bmu_ls_wdata ,output wire [31:0]  bmu2idu_ls_rdata ,output wire         bmu2idu_valid    ,output wire [31:0]  bmu2idu_instr    ,output reg  [17:0]  bmu2idu_pc_cur   ,output wire [17:0]  bmu2idu_pc_nxt
);reg             discard;
reg             load_data;
reg  [17:0]     prefetch_pc;reg             instr_wsel;
reg             instr_rsel;
reg  [1:0]      instr_size;
reg  [31:0]     instr_buf0;
reg  [31:0]     instr_buf1;wire bus_addr_fire = bus_avalid & bus_aready;
wire bus_resp_fire = bus_rvalid & bus_rready;
wire bus_data_fire = bus_resp_fire & ~discard &  load_data;
wire bus_inst_fire = bus_resp_fire & ~discard & ~load_data;wire bus_load_fire  = idu2bmu_ls_req & ~idu2bmu_ls_cmd & bus_data_fire;
wire bus_store_fire = idu2bmu_ls_req &  idu2bmu_ls_cmd & bus_addr_fire;
wire instr_out_fire = bmu2idu_valid & (bus_store_fire | bus_load_fire | ~idu2bmu_ls_req);wire byte_at_0 = idu2bmu_ls_size[1] | idu2bmu_ls_size[0] & ~idu2bmu_ls_addr[1] | idu2bmu_ls_addr[1:0] == 2'd0;
wire byte_at_1 = idu2bmu_ls_size[1] | idu2bmu_ls_size[0] & ~idu2bmu_ls_addr[1] | idu2bmu_ls_addr[1:0] == 2'd1;
wire byte_at_2 = idu2bmu_ls_size[1] | idu2bmu_ls_size[0] &  idu2bmu_ls_addr[1] | idu2bmu_ls_addr[1:0] == 2'd2;
wire byte_at_3 = idu2bmu_ls_size[1] | idu2bmu_ls_size[0] &  idu2bmu_ls_addr[1] | idu2bmu_ls_addr[1:0] == 2'd3;wire pc_set_fire = idu2bmu_pc_set & bmu2idu_pc_ack;assign bmu2idu_pc_ack = instr_out_fire;assign bus_write = idu2bmu_ls_cmd;assign bus_strb  = {byte_at_3, byte_at_2, byte_at_1, byte_at_0};assign bus_addr  = idu2bmu_ls_req & ~load_data ? idu2bmu_ls_addr[19:2] : prefetch_pc;assign bus_wdata = idu2bmu_ls_wdata;assign bus_rready = 1'b1;assign bmu2idu_ls_rdata = bus_rdata;assign bmu2idu_valid = |instr_size;assign bmu2idu_instr = instr_rsel ? instr_buf1 : instr_buf0;assign bmu2idu_pc_nxt = bmu2idu_pc_cur + 1'b1;always @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)discard <= 1'b0;else if(pc_set_fire)discard <= 1'b1;else if(bus_addr_fire)discard <= 1'b0;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)load_data <= 1'b0;else if(bus_addr_fire & idu2bmu_ls_req & ~load_data & ~idu2bmu_ls_cmd)load_data <= 1'b1;else if(bus_data_fire)load_data <= 1'b0;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)prefetch_pc <= 18'd0;else if(pc_set_fire)prefetch_pc <= idu2bmu_pc_new;else if(bus_addr_fire & (~idu2bmu_ls_req | load_data))prefetch_pc <= prefetch_pc + 1'b1;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)bus_avalid <= 1'b0;elsebus_avalid <= 1'b1;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)bmu2idu_pc_cur <= 18'd0;else if(pc_set_fire)bmu2idu_pc_cur <= idu2bmu_pc_new;else if(instr_out_fire)bmu2idu_pc_cur <= bmu2idu_pc_nxt;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)instr_wsel <= 1'b0;else if(pc_set_fire)instr_wsel <= 1'b0;else if(bus_inst_fire)instr_wsel <= ~instr_wsel;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)instr_rsel <= 1'b0;else if(pc_set_fire)instr_rsel <= 1'b0;else if(instr_out_fire)instr_rsel <= ~instr_rsel;
endalways @(posedge core_clk or negedge core_rstn)
beginif(!core_rstn)instr_size <= 2'd0;else if(pc_set_fire)instr_size <= 2'd0;elseinstr_size <= instr_size + bus_inst_fire - instr_out_fire;
endalways @(posedge core_clk)
beginif(~instr_wsel & bus_inst_fire)instr_buf0 <= bus_rdata;
endalways @(posedge core_clk)
beginif(instr_wsel & bus_inst_fire)instr_buf1 <= bus_rdata;
endendmodule

6.总结

本文设计了总线管理单元,内部包含了2个指令缓存,电路结构简单。通过精细的逻辑控制和状态管理,实现了与外部总线的高效交互,支持指令的预取和数据的加载存储操作,是处理器设计中重要的组成部分。


http://www.ppmy.cn/news/1507240.html

相关文章

Linux安全与高级应用(四)深入探索MySQL数据库:安装、管理与安全实践

文章目录 标题&#xff1a;全面解析LAMP平台部署及应用第一部分&#xff1a;LAMP平台概述第二部分&#xff1a;准备工作第三部分&#xff1a;安装和配置PHP第四部分&#xff1a;配置Apache第五部分&#xff1a;测试LAMP平台第六部分&#xff1a;部署phpMyAdmin总结 &#x1f44…

【海贼王航海日志:前端技术探索】CSS你了解多少?(三)

目录 1 -> 浏览器调试工具——查看CSS属性 1.1 -> 打开浏览器 1.2 -> 标签页含义 1.3 -> elements标签页使用 2 -> 元素的显示模式 2.1 -> 块级元素 2.2 -> 行内元素/内联元素 2.3 -> 改变显示模式 3 -> 盒模型 3.1 -> 边框 3.2 ->…

MySql-索引事务

在面试中&#xff0c;对于mysql相关的面试题常看的两部分也是我们学习时需要重点了解的内容&#xff1a;索引与事务。 目录 索引 B树 B树结构 B树创建 事务 重点&#xff1a;事务的基本特性 一、原子性 二、一致性 三、持久性 四、隔离性 索引 索引的核心内容&#…

白骑士的Matlab教学进阶篇 2.3 信号处理

系列目录 上一篇&#xff1a;白骑士的Matlab教学进阶篇 2.2 数值计算 信号处理在现代工程和科学领域中扮演着至关重要的角色。MATLAB作为一个强大的数学计算平台&#xff0c;提供了丰富的工具和函数来帮助研究人员和工程师处理各种信号问题。本文将深入介绍MATLAB中信号处理的…

C# 集合操作的艺术:深入解析数据分区策略与高效筛选技巧(Skip、SkipWhile、Take、TakeWhile)

文章目录 概述Skip 和 SkipWhile 方法Take 和 TakeWhile 方法综合应用示例总结 在C#中&#xff0c;LINQ&#xff08;语言集成查询&#xff09;提供了一种非常方便的方式来处理数据集合。本文将详细介绍四种数据分区方法&#xff1a;Skip、SkipWhile、Take、TakeWhile&#xff0…

【Pytorch实用教程】PyTorch中的torch.clamp()函数

torch.clamp() 是 PyTorch 中一个用于张量元素值限制的函数。它可以将张量中的元素限制在一个指定的范围内,即将所有小于最小值的元素设为最小值,将所有大于最大值的元素设为最大值。 函数签名 torch.clamp(input, min=None, max=None, *, out=None)参数

springboot Isolation.READ_COMMITTED不生效解决办法

问题描述 springbootmybatis可读已提交不生效&#xff0c;先在springboot查询出结果然后在数据库修改值后在Java再次读取&#xff0c;结果读取的还是修改之前的值 原因: 是mybatis二级缓存导致的 解决办法 方案一 ​​​​​​​Resource private SqlSession sqlSession;…

白骑士的Matlab教学附加篇 5.1 MATLAB开发工具

系列目录 上一篇&#xff1a;白骑士的Matlab教学实战项目篇 4.4 机器学习与AI 在 MATLAB 开发过程中&#xff0c;选择合适的编辑器和集成开发环境&#xff08;IDE&#xff09;至关重要。一个好的编辑器不仅可以提高编程效率&#xff0c;还可以帮助开发者更好地管理和调试代码。…

使用samba在ubuntu和windows之间共享文件

1、在ubuntu上安装samba 在终端输入命令 sudo apt update sudo apt install samba 2、配置samba 打开samba 的配置文件 sudo nano /etc/samba/smb.conf 在文件末尾添加以下内容 [shared] path /home/lzx available yes valid users lzx read only no browsable yes…

【云原生】看一眼haproxy,秒变技术大佬(理论篇)

一、负载均衡 1、什么是负载均衡&#xff1f; 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均衡将特定的业务(网络服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&…

【面试常问之网络】网络故障排查方面

目录 一、一台主机的网络出现了问题,如何排查(网络故障排查思路)? 二、一台主机提供的服务器访问起来很慢,如何排查原因? 三、导致网络变慢的原因(网络卡顿排查思路) 四、一个由虚拟机中的web应用提供的服务,使用浏览器无法访问该服务,如何排查原因 五、一个服务…

C# Type 对象序列化与反序列化

Type 对象序列化与反序列化 &#x1f364;序列化&#x1f969;反序列化 &#x1f364;序列化 var ty xxx.GetType(); var fullTypeName ty.AssemblyQualifiedName;&#x1f969;反序列化 ty Type.GetType(fullTypeName);

合并图片为pdf

1.先使用IDM在网页下载&#xff1a; 2.按文件类型分组&#xff0c;在按名称大小排序&#xff0c;之后使用Acrobat合并文件成一个pdf即可

Python删除lru_cache缓存

在 Python 中,lru_cache 是一个装饰器,用于添加缓存功能以提高函数的性能。如果你想清除或者删除 lru_cache 中的缓存,有几种方法可以做到: 手动清除缓存: lru_cache 对象有一个方法叫做 cache_clear(),可以手动清除所有缓存。示例:@lru_cache(maxsize=128) def some_fun…

制造知识普及(十)-- 常见的工业软件介绍

「 1. ERP」 企业资源计划&#xff08;enterprise resource planning&#xff0c;ERP&#xff09;是制造企业的核心管理软件。ERP系统的基本思想是以销定产&#xff0c;协同管控企业的产、供、销、人、财、物等资源&#xff0c;帮助企业按照销售订单&#xff0c;基于产品的制造…

oracle 判断某个字段包含某几个字符like或INSTR

在Oracle数据库中&#xff0c;如果你想判断某个字段是否包含某几个字符&#xff08;字符序列&#xff09;&#xff0c;你可以使用LIKE操作符或者INSTR函数。选择哪一个取决于你的具体需求&#xff0c;比如是否需要对位置敏感或者是否需要在模式匹配中使用通配符。 使用LIKE操作…

nginx在同一域名下部署多个vue项目

本文介绍使用nginx服务器在同一个域名下如何部署多个前端项目&#xff0c;在vue3使用vite打包时配置文件vite.config.ts中的base的配置方式&#xff0c;以及vue-router中history的配置方式&#xff0c;以及如何在nginx中配置才能使前端项目正常解析等关键步骤&#xff0c;结束你…

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程&#xff0c;主要用途是为了日志采集&#xff0c;所以搭建相对比较简单暴力&#xff0c;不过也可以作为一个参考供大家学习&#xff0c;主打一个能用管跑&#xff08;调优啊&#xff0c;参数解释啊&#xff0c;原理啊&#xff0c;太枯燥了&a…

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型

GitHub - OpenBMB/MiniCPM-V: MiniCPM-V 2.6: A GPT-4V Level MLLM for Single Image, Multi Image and Video on Your Phone 2408.01800 (arxiv.org) 目录 Introduction Model Architecture Training End-side Deployment MiniCPM-V是一种高效的多模态大型语言模型&…

vue前端自适应布局,一步到位所有自适应

页面展示 实现内容 1&#xff0c;左右布局 左侧固定宽带&#xff0c;右侧自适应剩余的宽度。中间一条分割线&#xff0c;可以拖拉&#xff0c;自适应调整左右侧的宽度。左侧的高度超长自动出现横向滚动条&#xff0c;左侧宽度超长&#xff0c;自动出现竖向滚动条。 2&#x…