【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

news2024/11/15 10:36:00

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

文章目录

  • 【RISC-V设计-07】- RISC-V处理器设计K0A之CSR
    • 1.简介
    • 2.顶层设计
    • 3.端口说明
    • 4.寄存器说明
    • 5.代码设计
    • 6.总结

1.简介

控制和状态寄存器(Control and Status Register,简称CSR)是用于控制和反映处理器核心状态及执行环境的特殊寄存器。RISC-V 架构中专门划分出了4K CSR 空间。这个单独定义的 CSR 空间为处理器的控制和状态管理提供了一个集中且明确的区域。它使得与处理器相关的各种配置和状态信息能够被高效地组织和访问。

其优势包括:

  1. 提高了系统的可扩展性:新的功能和特性可以通过在 CSR 空间中添加新的寄存器来实现,而不会干扰现有的指令集架构。
  2. 增强了编程的便利性:开发者能够通过统一的方式访问和操作与处理器相关的关键信息。

在 RISC-V 架构中,CSR 地址的划分具有明确的规则和特定的范围。

通常,CSR 地址被划分为不同的区域,以对应不同的功能和用途。一些地址范围可能被分配用于处理器的核心控制,如设置处理器的运行模式、中断控制等。另一些地址范围可能用于存储与性能监测相关的信息,如指令执行的周期数、缓存命中率等。

以常见的划分方式来说:

  • 0x000 到 0x1FF 范围内的地址可能用于基本的处理器控制和状态信息。
  • 0x200 到 0x3FF 可能用于与特定扩展功能相关的 CSR 。

但这种划分并非是绝对固定的,不同的 RISC-V 实现可能会根据具体的需求和设计进行微调。

在本设计中,CSR主要用于挂载核内中断控制器,通过这种方式,能够实现对外部中断输入的集中管理和控制。支持 16 个外部中断输入意味着系统具备了处理多种外部事件的能力。

2.顶层设计

3.端口说明

序号端口位宽方向说明
1core_clk1input内核时钟
2core_rstn1input内核复位信号,低有效
3idu2csr_we1inputCSR读写总线,写使能
4idu2csr_addr12inputCSR读写总线,地址
5idu2csr_wdata32inputCSR读写总线,写数据
6csr2idu_rdata32outputCSR读写总线,读数据
7csr2cic_gie1output全局中断使能
8csr2cic_mie16output机器模式下每个中断源的使能
9csr2cic_mip16output机器模式下每个中断源的等待
10cic2csr_irq16input中断请求
11cic2csr_mcause5input中断原因
12csr2idu_mepc18output机器异常程序计数器
13csr2idu_mtvec18output机器模式下中断向量
14idu2csr_mepc_set1input机器模式下中断发生时的PC保存请求
15idu2csr_mepc_nxt18input机器模式下中断发生时的PC保存数据

4.寄存器说明

寄存器的地址设计和 RISC-V 的标准兼容,这是一个遵循规范和确保兼容性的重要举措。RISC-V 标准对寄存器地址的定义具有明确的规则和约定,遵循这些标准能够带来多方面的好处。首先,确保了与其他符合 RISC-V 架构的组件和系统的良好兼容性。这意味着在不同的 RISC-V 实现之间,可以更轻松地进行交互和集成。

地址寄存器特性默认值说明
0x300MSTATUSRW0x00000000bit3: 全局中断使能
0x301MISARO0x40000010RV32E CPU
0x304MIERW0x0000000016个外部中断的使能位
0x305MTVECRW0x00000000中断向量,低2bit为0
0x341MEPCRW0x00000000机器异常程序计数器,低2bit为0
0x342MCAUSERO0x00000000中断原因,bit31为1表示存在中断,bit3-bit0表示中断编号
0x344MIPRW1C0x00000000中断请求的等待
0xF12MARCHIDRO0x4b2d3041字符“K0-A"的ASCII码

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. Control and Status Register
// -------------------------------------------------------------------------------------------------

module k0a_core_csr (
    input  wire         core_clk         ,
    input  wire         core_rstn        ,

    input  wire         idu2csr_we       ,
    input  wire [11:0]  idu2csr_addr     ,
    input  wire [31:0]  idu2csr_wdata    ,
    output wire [31:0]  csr2idu_rdata    ,

    output reg          csr2cic_gie      ,
    output reg  [15:0]  csr2cic_mie      ,
    output reg  [15:0]  csr2cic_mip      ,
    input  wire [15:0]  cic2csr_irq      ,
    input  wire [4:0]   cic2csr_mcause   ,

    output reg  [17:0]  csr2idu_mepc     ,
    output reg  [17:0]  csr2idu_mtvec    ,
    input  wire         idu2csr_mepc_set ,
    input  wire [17:0]  idu2csr_mepc_nxt
);

localparam CSR_MARCHID  = 12'hf12;
localparam CSR_MSTATUS  = 12'h300;
localparam CSR_MISA     = 12'h301;
localparam CSR_MIE      = 12'h304;
localparam CSR_MTVEC    = 12'h305;
localparam CSR_MEPC     = 12'h341;
localparam CSR_MCAUSE   = 12'h342;
localparam CSR_MIP      = 12'h344;

wire csr_marchid_sel  = idu2csr_addr == CSR_MARCHID;
wire csr_mstatus_sel  = idu2csr_addr == CSR_MSTATUS;
wire csr_misa_sel     = idu2csr_addr == CSR_MISA;
wire csr_mie_sel      = idu2csr_addr == CSR_MIE;
wire csr_mtvec_sel    = idu2csr_addr == CSR_MTVEC;
wire csr_mepc_sel     = idu2csr_addr == CSR_MEPC;
wire csr_mcause_sel   = idu2csr_addr == CSR_MCAUSE;
wire csr_mip_sel      = idu2csr_addr == CSR_MIP;

always @(posedge core_clk or negedge core_rstn)
begin
    if(!core_rstn)
        csr2cic_gie <= 1'b0;
    else if(csr_mstatus_sel & idu2csr_we)
        csr2cic_gie <= idu2csr_wdata[3];
end

always @(posedge core_clk or negedge core_rstn)
begin
    if(!core_rstn) begin
        csr2cic_mie <= 16'd0;
    end else if(csr_mie_sel & idu2csr_we)
        csr2cic_mie <= idu2csr_wdata[15:0];
end

always @(posedge core_clk)
begin
    if(csr_mtvec_sel & idu2csr_we)
        csr2idu_mtvec <= idu2csr_wdata[19:2];
end

always @(posedge core_clk)
begin
    if(idu2csr_mepc_set)
        csr2idu_mepc <= idu2csr_mepc_nxt;
    else if(csr_mepc_sel & idu2csr_we)
        csr2idu_mepc <= idu2csr_wdata[19:2];
end

always @(posedge core_clk or negedge core_rstn)
begin
    if(!core_rstn)
        csr2cic_mip <= 16'd0;
    else if(csr_mip_sel & idu2csr_we)
        csr2cic_mip <= idu2csr_wdata[15:0] | cic2csr_irq;
    else if(csr2cic_gie)
        csr2cic_mip <= csr2cic_mip | cic2csr_irq;
end

assign csr2idu_rdata = {32{csr_marchid_sel  }} & 32'h4b2d3041                                    |
                       {32{csr_mstatus_sel  }} & {28'h180, csr2cic_gie, 3'd0}                    |
                       {32{csr_misa_sel     }} & 32'h40000010                                    |
                       {32{csr_mie_sel      }} & {16'd0, csr2cic_mie}                            |
                       {32{csr_mtvec_sel    }} & {12'd0, csr2idu_mtvec, 2'd0}                    |
                       {32{csr_mepc_sel     }} & {12'd0, csr2idu_mepc, 2'd0}                     |
                       {32{csr_mcause_sel   }} & {cic2csr_mcause[4], 27'd0, cic2csr_mcause[3:0]} |
                       {32{csr_mip_sel      }} & {16'd0, csr2cic_mip}                            ;

endmodule

6.总结

在本文所介绍的 CSR 实现中,为追求极致简洁而未依照 RISC-V 标准在内部实现计数器的设计,这一决策具有一定的特点和影响。这种选择带来的好处是能够减少设计的复杂性和资源消耗。通过舍弃计数器的设计,可能降低了硬件实现的成本和面积,使得整个系统更加紧凑和高效。如果在本设计的应用场景中,对计数器的需求并不强烈或者可以通过外部的方式来满足计数要求,那么这种追求简洁的设计策略就是合理且有效的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题&#xff0c;需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存&#xff0c;使用Process Explorer工具可以看到 2.3、通过Process Explorer工…

通世智库:姚力渟——第一次走进缓和医疗

2024年7月9日&#xff0c;我因工作原因&#xff0c;第一次以工作者的视角走进了位于北京市中心最具盛名的协和医院缓和医疗门诊&#xff0c;亲临现场去感受缓和医疗给患者及家属的贴心温暖和有益帮助。在此之前&#xff0c;我是一个惧怕医院&#xff0c;并时刻抱着能不去医院就…

Waterfox水狐浏览器:追求性能与隐私的64位网络探索者

大家好&#xff0c;今天电脑天空要为大家详细介绍一款基于Mozilla Firefox源代码开发的浏览器——Waterfox&#xff08;水狐浏览器&#xff09;。它专为64位系统优化&#xff0c;致力于提供更快速、更高效的浏览体验&#xff0c;并高度重视用户隐私保护。 主要特点 1. 高性能…

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…

【数学建模】 多模数据与智能模型

文章目录 多模数据与智能模型1. 数字图像处理与计算机视觉1.1 数字图像的表示与处理1.1.1 认识OpenCV1.1.2 色彩学1.1.3 常见图像操作 1.2 数字图像的特征点1.2.1 Sobel算子1.2.2 Canny算子1.2.3 Harris角点检测1.2.4 ORB特征点检测 1.3 计算机视觉1.3.1 卷积神经网络1.3.2 YOL…

学习日志8.7--NGFW(Next Generation Firewall)下一代防火墙

目录 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 二、防火墙CLI命令行配置 三、防火墙初始化Web登入 一、NGFW&#xff08;Next Generation Firewall&#xff09;下一代防火墙 防火墙是用来实现识别外部的安全流量&#xff0c;抵御外部的攻击流…

vue3+element-plus+flask 简易【工作日志本】小软件(过程超详细)

终于有时间继续学习技术了&#xff01;开发了一个简易的用于记录日常工作内容的小软件&#xff0c;权当学习和练手。功能如下&#xff1a;用户登录、日志内容的查、增、删、改以及导出。 开发环境&#xff1a; windows 10&#xff0c;mysql 8&#xff0c;Hbuilder X&#xff08…

Linux -- 进度条小程序

目录 一、缓冲区 二、回车与换行 三、进度条 1、版本一 2、版本二 在写小程序之前先来了解两个知识点 一、缓冲区 缓冲区(buffer)&#xff0c;它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或者输出的数据&#…

【eNSP模拟实验】交换机调整stp根端口和配置边缘端口

拓扑 关闭提示和设备重命名 将S1~S4交换机都做如下相关对应的配置 <Huawei>sys [Huawei]un in en [Huawei]sys S1 调整根端口 当前S3交换机生成树简要信息&#xff0c;其中e0/0/1是阻塞端口&#xff0c;e0/0/5是根端口。如何让e0/0/5变成阻塞端口&#xff0c;让e0/0/1…

【面试题】IDEA实现Debug远程调试Linux中的系统

有朋友面试时被问到&#xff0c;怎么远程调试部署在Linux中的系统&#xff1f;听到这个问题&#xff0c;那位朋友直接懵了&#xff0c;第一反应是震惊&#xff0c;已经部署在Linux中的系统还能调试&#xff1f; 沉默了几秒&#xff0c;只好说没有远程调试过Linux中的系统&#…

Debian 12 Linux系统安装Mongodb服务器步骤

在本地或云中运行的 Debian12 或 11 Linux 发行版上设置 MongoDB 数据库服务器并不是一件困难的事情&#xff0c;但是&#xff0c;必须知道如何使用终端和 Linux 命令行。虽然 MongoDB 除了社区版之外还提供了企业版&#xff0c;但在这里我们将使用这个免费的开源 NoSQL 文档数…

Spring基础知识学习总结(四)

&#xff08;5&#xff09;Spring新注解 使用上面的注解还不能全部替代xml配置文件&#xff0c;还需要使用注解替代的配置如下&#xff1a; 非自定义的Bean的配置&#xff1a;<bean>加载properties文件的配置&#xff1a;<context:property-placeholder>组件扫描…

Linux 文件、重定向、缓冲区

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、文件 1、文件的理解&#xff08;浅层&#xff09; 1.文件是什么&#xff1f; 2.文件操作的前提 3.文件的存储 4.一个进程可以打开多个文件吗&#xff1f;如果可以怎么管理的&#xf…

【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式

文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…

三大浏览器Google Chrome、Edge、Firefox内存占用对比

问题 Chrome、Edg、Firefox三家究竟谁的占用少 结论 打开一个页面内存占用 Firefox>Edge>Chrome 打开打量页面内存占用 Firefox>Chrome>Edge 从监视器可以看到Edge增加一个页面增加一个页面不到100M而其它浏览器需要150M左右;Firefox浏览器主线程内存占用800M比…

Java之TCP网络编程

TCP网络编程 1 概述 在TCP通信协议下&#xff0c;计算机网络中不同设备上的应用程序之间可以通信&#xff0c;通信时需严格区分客户端&#xff08;Client&#xff09;与服务器端&#xff08;Server&#xff09;。 在Java中&#xff0c;对于这样基于TCP协议下连接通信的客户端…

数据结构-常见排序的七大排序

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…

Arkose 验证码:网络抓取工具的最佳实践

网络爬虫已经成为企业和开发人员最常用的工具&#xff0c;用于有效地从网络中收集数据。当然&#xff0c;大家都会遇到的最常见挑战是大量的 CAPTCHA 出现&#xff0c;这会使工作流程陷入停滞。其中&#xff0c;Arkose Labs Captcha&#xff08;称为 Funcaptcha&#xff09;以其…

探索N卡录制:游戏录屏工具会是网页录屏的最佳伴侣吗?

在这个数字时代&#xff0c;无论是游戏玩家、教育工作者还是内容创作者&#xff0c;高质量的录屏工具都是必不可少的。NVIDIA显卡&#xff08;简称N卡&#xff09;以其卓越的图形处理能力而闻名&#xff0c;而N卡录制功能则进一步扩展了其应用范围&#xff0c;特别是在游戏录屏…

【SpringBoot 属性加载机制】

SpringBoot 属性加载 一个 SpringBoot 应用的配置属性可以有多种不同的来源, 比如可以来自操作系统的环境变量, 比如可以来自 application.yaml 文件; 每一种不同的属性来源, 都会被 SpringBoot 封装成一个PropertySource对象, 保存在 Environment 对象的 PropertySources 类型…