【RISC-V设计-09】- RISC-V处理器设计K0A之CIC

news2024/9/25 15:24:18

【RISC-V设计-09】- RISC-V处理器设计K0A之CIC

文章目录

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

1.简介

核内中断控制器(Core Interrupt Controller,简称CIC)是管理和仲裁中断的模块,能够根据预设的优先级规则,逐一上报中断请求的序号。本模块具有如下几点功能:

  1. 根据全局中断使能,控制中断序号的上报;
  2. 根据独立中断使能,控制对应的中断请求;
  3. 记录中断状态,根据中断状态向指令译码单元发出中断请求;
  4. 根据指令译码单元发出中断应答,清除中断请求;
  5. 通过软件、硬件结合的方式,支持晚到中断、咬尾中断;

2.顶层设计

3.端口说明

序号端口位宽方向说明
1core_clk1input内核时钟
2core_rstn1input内核复位信号,低有效
3irq_lines16input外部中断信号,高电平/脉冲触发
4csr2cic_gie1input全局中断使能
5csr2cic_mie16input独立控制的中断使能
6csr2cic_mip16input中断请求等待
7cic2csr_irq16output外部中断信号,高电平/脉冲触发
8cic2csr_mcause5output中断原因记录
9cic2idu_int_req1output向译码单元发送的中断请求
10idu2cic_int_ack1input译码单元返回的中断应答
11idu2cic_int_mret1input译码单元执行中断返回指令

4.代码设计

// -------------------------------------------------------------------------------------------------
// 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. Core Interrupt Controller
// -------------------------------------------------------------------------------------------------

module k0a_core_cic (
    input  wire         core_clk        ,
    input  wire         core_rstn       ,

    input  wire [15:0]  irq_lines       ,

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

    output reg          cic2idu_int_req ,
    input  wire         idu2cic_int_ack ,
    input  wire         idu2cic_int_mret
);

reg     status_irq;

wire cic_int_hit = cic2idu_int_req & idu2cic_int_ack;

wire [15:0] irq_src = csr2cic_mip & csr2cic_mie;

assign cic2csr_irq = irq_lines;

always @(posedge core_clk or negedge core_rstn)
begin
    if(!core_rstn)
        status_irq <= 1'b0;
    else if(cic_int_hit)
        status_irq <= 1'b1;
    else if(idu2cic_int_mret)
        status_irq <= 1'b0;
end

always @(posedge core_clk)
begin
    if(csr2cic_gie) begin
        case(1'b1)
            irq_src[ 0] : cic2csr_mcause <= {1'b1, 4'h0};
            irq_src[ 1] : cic2csr_mcause <= {1'b1, 4'h1};
            irq_src[ 2] : cic2csr_mcause <= {1'b1, 4'h2};
            irq_src[ 3] : cic2csr_mcause <= {1'b1, 4'h3};
            irq_src[ 4] : cic2csr_mcause <= {1'b1, 4'h4};
            irq_src[ 5] : cic2csr_mcause <= {1'b1, 4'h5};
            irq_src[ 6] : cic2csr_mcause <= {1'b1, 4'h6};
            irq_src[ 7] : cic2csr_mcause <= {1'b1, 4'h7};
            irq_src[ 8] : cic2csr_mcause <= {1'b1, 4'h8};
            irq_src[ 9] : cic2csr_mcause <= {1'b1, 4'h9};
            irq_src[10] : cic2csr_mcause <= {1'b1, 4'ha};
            irq_src[11] : cic2csr_mcause <= {1'b1, 4'hb};
            irq_src[12] : cic2csr_mcause <= {1'b1, 4'hc};
            irq_src[13] : cic2csr_mcause <= {1'b1, 4'hd};
            irq_src[14] : cic2csr_mcause <= {1'b1, 4'he};
            irq_src[15] : cic2csr_mcause <= {1'b1, 4'hf};
            default     : cic2csr_mcause <= 5'd0;
        endcase
    end
end

always @(posedge core_clk or negedge core_rstn)
begin
    if(!core_rstn)
        cic2idu_int_req <= 1'b0;
    else if(cic_int_hit)
        cic2idu_int_req <= 1'b0;
    else if(~status_irq & (|irq_src))
        cic2idu_int_req <= 1'b1;
end

endmodule

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.
# -------------------------------------------------------------------------------------------------

	.section .init, "ax", @progbits
	.globl  _start
	.align  2
_start:
	.option norvc;
    j       handler_reset
    .word   handler_irq0
    .word   handler_irq1
    .word   handler_irq2
    .word   handler_irq3
    .word   handler_irq4
    .word   handler_irq5
    .word   handler_irq6
    .word   handler_irq7
    .word   handler_irq8
    .word   handler_irq9
    .word   handler_irq10
    .word   handler_irq11
    .word   handler_irq12
    .word   handler_irq13
    .word   handler_irq14
    .word   handler_irq15

	.section .text.handler_isr, "ax", @progbits
	.align    2
handler_isr:
    addi sp, sp, -56
    sw x1 , 0(sp)
    sw x4 , 4(sp)
    sw x5 , 8(sp)
    sw x6 , 12(sp)
    sw x7 , 16(sp)
    sw x8 , 20(sp)
    sw x9 , 24(sp)
    sw x10, 28(sp)
    sw x11, 32(sp)
    sw x12, 36(sp)
    sw x13, 40(sp)
    sw x14, 44(sp)
    sw x15, 48(sp)
1:
    csrr a0, mcause
    beq x0, a0, 2f
    andi a0, a0, 15
    addi a1, x0, 1
    sll a2, a1, a0
    csrrc a2, mip, a2
    slli a0, a0, 2
    lw a1, 4(a0)
    jalr ra, a1, 0
    jal x0, 1b
2:
    lw x15, 48(sp)
    lw x14, 44(sp)
    lw x13, 40(sp)
    lw x12, 36(sp)
    lw x11, 32(sp)
    lw x10, 28(sp)
    lw x9 , 24(sp)
    lw x8 , 20(sp)
    lw x7 , 16(sp)
    lw x6 , 12(sp)
    lw x5 , 8(sp)
    lw x4 , 4(sp)
    lw x1 , 0(sp)
    addi sp, sp, 56
    mret

	.section .text.handler_default, "ax", @progbits
	.align    2
	.weak   handler_irq0
	.weak   handler_irq1
	.weak   handler_irq2
	.weak   handler_irq3
	.weak   handler_irq4
	.weak   handler_irq5
	.weak   handler_irq6
	.weak   handler_irq7
	.weak   handler_irq8
	.weak   handler_irq9
	.weak   handler_irq10
	.weak   handler_irq11
	.weak   handler_irq12
	.weak   handler_irq13
	.weak   handler_irq14
	.weak   handler_irq15
handler_irq0:
handler_irq1:
handler_irq2:
handler_irq3:
handler_irq4:
handler_irq5:
handler_irq6:
handler_irq7:
handler_irq8:
handler_irq9:
handler_irq10:
handler_irq11:
handler_irq12:
handler_irq13:
handler_irq14:
handler_irq15:
loop_isr:
	j loop_isr

	.section  .text.handler_reset, "ax", @progbits
	.align    2
handler_reset:
.option push
.option norelax
	la gp, __global_pointer$
.option pop
1:
	la sp, _eusrstack
2:
	la a0, _data_lma
	la a1, _data_vma
	la a2, _edata
	bgeu a1, a2, 2f
1:
	lw a3, 0(a0)
	sw a3, 0(a1)
	addi a0, a0, 4
	addi a1, a1, 4
	bgeu a1, a2, 2f
	lw a3, 0(a0)
	sw a3, 0(a1)
	addi a0, a0, 4
	addi a1, a1, 4
	bltu a1, a2, 1b
2:
    la a0, _sbss
    la a1, _ebss
    bgeu a0, a1, 2f
1:
    sw x0, 0(a0)
    addi a0, a0, 4
    bgeu a0, a1, 2f
    sw x0, 0(a0)
    addi a0, a0, 4
    bgeu a0, a1, 2f
    sw x0, 0(a0)
    addi a0, a0, 4
    bltu a0, a1, 1b
2:
    la a3, handler_isr
    csrw mtvec, a3

    j main

这段代码是开始运行时初始化的代码,同时还存在中断处理相关的操作,通过读取中断原因、进行一些位操作确定中断序号。如果中断原因不为 0,根据中断序号查找到中断向量表,跳转到特定的地址执行相应的中断处理程序。

6.总结

本文阐述了一种极为简洁的中断控制模块。该模块采用软件与硬件相结合的方式,来达成中断的处理。并且,它还能够支持晚到中断和咬尾中断,一次进出栈就能够处置多个现存的中断。如此一来,节省了中断处理的时间,提高了中断处理的效率。

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

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

相关文章

SQL注入实例(sqli-labs/less-18)

0、初始页面 先使用brup爆破密码&#xff0c;账号admin&#xff0c;密码admin 1、确定闭合字符 判断注入点在post请求参数的User-agent处 闭合字符为单引号 2、爆库名 3、爆表名 4、爆列名 5、查询最终目标 在index.php中有这么一句 $insert"INSERT INTO security.uage…

MySQL基础——数据库客户端,数据库服务器,数据库(目录)

什么是数据库 具体&#xff1a;mysqld服务器结合内部的存储引擎所实现对数据库文件中的数据增删查改的一套方案 ——在磁盘或内存中存储特定结构组织的数据----在磁盘中存储的一套数据方案&#xff0c; 你给我字段或要求&#xff0c;我直接给你结果就行 整体&#xff1a;用户通…

gradio之进度条

输出控件显示进度&#xff0c;进度结束显示控件结果 import gradio as gr import timedef slowly_reverse(word, progressgr.Progress()):progress(0, desc"Starting")time.sleep(1)progress(0.05)new_string ""for letter in progress.tqdm(word, desc&…

概率论原理精解【9】

文章目录 集类拓扑空间基 参考文献 集类 C是一个集类&#xff08;以G的某些子集为元素的集合称为G的集类&#xff09;。 A i ∈ C , ∩ i 1 n A i ∈ C , 此为有限交封闭 C 所得集类 C ∩ f A_i \in C,\cap_{i1}^nA_i \in C,此为有限交封闭C所得集类C_{\cap f} Ai​∈C,∩i1n…

2024年黑龙江公安招聘报名流程(建议电脑)

2024年黑龙江省公安机关人民警察专项招录公告&#xff08;2810人&#xff09; 报名时间&#xff1a;2024年8月16日9:00至8月20日17:00 查询资格审查结果时间&#xff1a;2024年8月16日9:00至8月20日17:00 缴费确认时间&#xff1a;2024年8月16日9:00至8月21日17:00 网上打印准考…

程序员保碗之策

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1. **持续深化技术实力&#xff1a;从基础到前沿**夯实基础紧跟技术前沿跨领域融合 2. **提升实战能力&#xff1a;从项目到产品**参与实际项目自主实践产品思维 3. **建立个人品牌与影响力&#xff…

代码随想录算法训练营day36:动态规划04:1049.最后一块石头的重量II;494.目标和;474.一和零

1049.最后一块石头的重量II 力扣题目链接(opens new window) 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&…

WEB应用(十五)---文件包含

文件包含的概念 在各种开发语言中都提供了内置的文件包含函数&#xff0c;可以使得开发人员在一个代码文件中直接包含&#xff08;引入&#xff09;另外一个代码文件。 由于文件包含可以达到复用和方便修改的目的&#xff0c;在代码设计中常常使用。 大多数情况下&#xff0…

构建生成工具cmake的使用(2)

一.制作库文件 Linux下动态库是以 .lib开头&#xff0c;以 .so为结尾。静态库以 .lib 开头&#xff0c;.a为结尾。 Windows下动态库以dll为结尾&#xff0c;以 .lib为结尾 1.1.cmake编写生成动态库 我们想把add.cc和sub.cc打成一个动态库 …

Spring Boot 3.x Rest API最佳实践之统一响应结构

上一篇&#xff1a;Spring Boot 3.x Rest API最佳实践之API实现 下一篇&#xff1a;Spring Boot 3.x Rest API统一异常处理最佳实践 前面我们完成了电商示例API的设计和简单实现&#xff0c;本小节在此基础上完成统一响应结构的实战。 文章目录 定义Response响应体拦截Rest A…

【Day04】0基础微信小程序入门-学习笔记

文章目录 基础加强学习目标自定义组件1. 创建与引用2. 样式3. 数据、方法和属性4. 数据监听器5. 纯数据字段6. 组件生命周期6.1 created6.2 attached&#xff08;使用最多&#xff09;6.3 detached6.4 定义生命周期函数 7. 组件所在页面的生命周期7.1 定义使用7.2 生成随机的RG…

【QGroundControl二次开发】九. QGC地面站替换自定义MAVLINK协议

一. 生成自定义mavlink协议 具体操作参考之前文章->【QGroundControl二次开发】四.QGC自定义MAVLink消息 -------------------------下面为具体操作--------------------------- 在mavlink源码下的mavlink-master\message_definitions\v1.0\common.xml加入自定义协议&…

(javaweb)请求响应postman

目录 一.请求响应概述 二.请求参数的接收及封装 1.postman 2. 简单参数 3.实体参数 4.数组集合参数 5.日期参数 6.JSON参数 二.设置响应数据 一.请求响应概述 1.Tomcat又称为servlet容器 前端浏览器发起请求携带http请求数据&#xff0c;web服务器负责请求协议的解析&a…

网站开发涉及到的技术内容介绍——后端PHP(1)

一、PHP简介 PHP(全称:Hypertext Preprocessor (超文本预处理器))是一种创建动态交互性网站的服务器端脚本语言( PHP代码可以放在HTML文档中的任何位置;且PHP 脚本是在服务器上运行,然后将纯 HTML 结果发送回浏览器)且PHP 是免费的,并且使用非常广泛。同类的后端语言有…

Element学习(布局组件、案例操作)(4)

1、页面整体的布局 2、找到这种布局对应的代码&#xff08;复制——>粘贴到标签<div>中&#xff09; <el-container><el-header>Header</el-header><el-container><el-aside width"200px">Aside</el-aside><el-main…

8.8C++作业

在类结构体中&#xff0c;运用 成员函数或友元函数 实现算术运算符重载 #include <iostream>using namespace std;class Stu {friend const Stu operator/(const Stu &R,const Stu &L);friend const Stu operator%(const Stu &R,const Stu &L); private…

【2024年电赛H题自动行驶小车】省一学长手把手从零教你学MSPM0

一、前前言 第十二届浙江省大学生电子设计竞赛终于落下帷幕了&#xff0c;名单已公示&#xff0c;几家欢喜几家愁&#xff1f;我觉得每一位经历过电赛的朋友都称得上英雄&#xff0c;我想我们所学到的并非是“省一等”或“成功参赛奖”一个头衔能囊括的&#xff0c;相信真正有…

一篇带你了解kickstart无人值守以及pxe实现服务器自动部署

目录 使用背景 pxe原理 一、kickstart无人值守实验 实验环境&#xff1a; kickstart脚本制作&#xff1a; http服务 DCHP服务 定位需要装的机器上&#xff08;已使用光盘&#xff09; 二、PXE实验 实验环境&#xff1a;在上个实验环境的基础上 使用已经做好的dhcp&am…

Type-C取电芯片LDR6500

在当今电子设备日新月异的时代&#xff0c;Type-C接口以其高效、便捷的特点迅速成为市场主流。这一接口不仅支持高速数据传输&#xff0c;还实现了正反插拔的便利性&#xff0c;极大地提升了用户体验。然而&#xff0c;在Type-C接口的广泛应用背后&#xff0c;一个关键的技术组…

数模评价类—【主成分分析法】

目录 文章目录 前言 一、主成分分析法是什么&#xff1f; 二、模型原理 三.实现步骤 1.x标准化处理 2.计算标准化样本后的协方差矩阵/样本相关系数矩阵 3.计算R的特征值&#xff08;入&#xff09;和特征向量 4.计算主成分贡献率和累计贡献率 5.写出主成分 总结 前言…