LoongArch 个人赛一级评测(前递旁路+load阻塞)

目录

  • LoongArch 个人赛一级评测(前递旁路+load阻塞)
    • 声明
    • 测试说明
  • 代码修改
    • thinpad_top.v
    • conver_ram.v
    • IF_stage
  • 测试
    • 自动评测
    • 在线实验
  • 踩坑记录
    • 读写使能控制
    • inout类端口的使用方法
    • Vivado生成Bit流文件时出现[Synth 8-91] ambiguous clock in event control
    • RAM字节使能的使用
    • | 运算
  • 参考资料

LoongArch 个人赛一级评测(前递旁路+load阻塞)

声明

本文使用的是远程自主龙架构CPU设计实验平台,需要使用LoongArch工程模板生成bit流文件。

测试说明

本实验需要实现一个 32 位 LoongArch CPU,支持LoongArch-C1指令集的 6 条指令:addi.w lu12i.w add.w st.w ld.w bne。

自动化脚本会通过运行下面的汇编程序,对你的 CPU 进行正确性测试。

测试过程对CPU实现有如下要求:

  1. 虚拟内存空间为0x80000000~0x807FFFFF,共8MB,要求整个内存空间均可读可写可执行。其中
    • 0x80000000~0x803FFFFF映射到BaseRAM;
    • 0x80400000~0x807FFFFF映射到ExtRAM。
  2. CPU字节序为小端序。
  3. CPU时钟使用外部时钟输入,50MHz / 11MHz两路时钟输入均可使用。
  4. 在复位按钮按下时(高电平)CPU处于复位状态,松开后解除。
  5. CPU复位后从0x80000000开始取指令执行。

测试步骤

  1. 将BaseRAM和ExtRAM重置,并将测试程序汇编成机器语言后写入到BaseRAM中。
  2. 单击复位按钮。
  3. 此时你的 CPU 应当从 BaseRAM 的起始地址开始执行程序,程序功能为循环斐波那契程序计算64次,结果分别写在ExtRAM的0x0 ~ 0x100中。
  4. 等待 1s。
  5. 脚本读取 ExtRAM 中地址为 0x0 ~ 0x100 的数据,注意此处地址的单位与 CPU 中一致,均为字节。

代码修改

thinpad_top.v

wire my_clk;
wire my_reset;
assign my_clk   = clk_10M;
assign my_reset = reset_of_clk10M;// inst ram <-> base ram
conver_ram inst_conver_ram(.clk              (my_clk         ),.resetn           (my_reset ),.cpu_sram_en      (cpu_inst_en   ),.cpu_sram_we      (cpu_inst_we   ),.cpu_sram_addr    (cpu_inst_addr ),.cpu_sram_wdata   (cpu_inst_wdata),.cpu_sram_rdata   (cpu_inst_rdata),.ram_data         (base_ram_data ),.ram_addr         (base_ram_addr ),.ram_be_n         (base_ram_be_n ),.ram_ce_n         (base_ram_ce_n ),.ram_oe_n         (base_ram_oe_n ),.ram_we_n         (base_ram_we_n )
);
// data ram <-> ext ram
conver_ram data_conver_ram(.clk              (my_clk          ),.resetn           (my_reset  ),.cpu_sram_en      (cpu_data_en   ),.cpu_sram_we      (cpu_data_we   ),.cpu_sram_addr    (cpu_data_addr ),.cpu_sram_wdata   (cpu_data_wdata),.cpu_sram_rdata   (cpu_data_rdata),.ram_data         (ext_ram_data ),.ram_addr         (ext_ram_addr ),.ram_be_n         (ext_ram_be_n ),.ram_ce_n         (ext_ram_ce_n ),.ram_oe_n         (ext_ram_oe_n ),.ram_we_n         (ext_ram_we_n )
);//cpu
mycpu_top u_mycpu_top(.clk              (my_clk          ),.resetn           (~my_reset  ),  //low active// inst.inst_sram_en     (cpu_inst_en   ),.inst_sram_we     (cpu_inst_we   ),.inst_sram_addr   (cpu_inst_addr ),.inst_sram_wdata  (cpu_inst_wdata),.inst_sram_rdata  (cpu_inst_rdata),// data.data_sram_en     (cpu_data_en   ),.data_sram_we     (cpu_data_we   ),.data_sram_addr   (cpu_data_addr ),.data_sram_wdata  (cpu_data_wdata),.data_sram_rdata  (cpu_data_rdata)// //debug// .debug_wb_pc      (debug_wb_pc      ),// .debug_wb_rf_we   (debug_wb_rf_we   ),// .debug_wb_rf_wnum (debug_wb_rf_wnum ),// .debug_wb_rf_wdata(debug_wb_rf_wdata)
);
// 这部分代码注释掉
// // 不使用内存、串口时,禁用其使能信号
// assign base_ram_ce_n = 1'b1;
// assign base_ram_oe_n = 1'b1;
// assign base_ram_we_n = 1'b1;// assign ext_ram_ce_n = 1'b1;
// assign ext_ram_oe_n = 1'b1;
// assign ext_ram_we_n = 1'b1;

conver_ram.v

用于实现cpu_ram和base_ram、ext_ram之间信号的转换适配。

module conver_ram (input               clk               ,input               resetn            ,// CPU RAM signalinput              cpu_sram_en      ,input       [ 3:0] cpu_sram_we      ,input       [31:0] cpu_sram_addr    ,input       [31:0] cpu_sram_wdata   ,output reg  [31:0] cpu_sram_rdata   ,// BaseRAM/ExtRAM signalinout  wire[31:0]  ram_data,        //RAM数据,低8位与CPLD串口控制器共享output wire[19:0]  ram_addr,        //RAM地址output wire[ 3:0]  ram_be_n,        //RAM字节使能,低有效。如果不使用字节使能,请保持为0output wire        ram_ce_n,        //RAM片选,低有效output wire        ram_oe_n,        //RAM读使能,低有效output wire        ram_we_n         //RAM写使能,低有效
);
// most import is ram_be_n signal
// if write, cpu_we=1(high si valid), ram_be_n=0(low is valid)
// if read , ram_be_n=0000(low is valid)
// assign sram_be_n = ~(|wen&&en ? wen : 4'hf);
assign ram_be_n = ( | cpu_sram_we && cpu_sram_en) ? ~cpu_sram_we : 4'h0;
assign ram_ce_n = ~cpu_sram_en;
assign ram_we_n = ~( | cpu_sram_we && cpu_sram_en);
assign ram_oe_n = ( | cpu_sram_we && cpu_sram_en);
// 按字节寻址
assign ram_addr = cpu_sram_addr[21:2];assign ram_data = ~ram_we_n ? cpu_sram_wdata : 32'hz;always @(posedge clk or negedge resetn) beginif (resetn) begincpu_sram_rdata <= 32'hz;end else if (~ram_oe_n) begincpu_sram_rdata <= ram_data;end
endendmodule

IF_stage

always @(posedge clk) beginif (reset) beginfs_pc <= 32'h7FFFFFFC;     //7FFFFFFC, trick: to make nextpc be 0x80000000 during reset //           80000000 7FFFFFFC//           803FFFFFendelse if (to_fs_valid && (fs_allowin || br_taken)) begin// if taken is valid, to skip the delay slot instruction, next_pc should be the instruction after the jump instfs_pc <= nextpc;end
end

测试

自动评测

在这里插入图片描述

在线实验

Ext_Ram内容正确(小端序)。
在这里插入图片描述

踩坑记录

读写使能控制

  • 使用inout端口时要注意读写使能的控制,当读(写)RAM时读使能有效、写使能无效(读使能无效、写使能有效)
  • 读使能和写使能同一时间只能有一个是有效的。

inout类端口的使用方法

当control信号为真时,三态门导通,这时,DataOut的输出通过双向端口传输到DataBus上。但是DataIn与DataOut直接相连,如何保证DataOut的数据不会影响到DataIn相连的电路呢?

解决这个问题的办法是把DataIn声明为reg型,而reg型的变量在always过程块中被赋值,需要再增加一个控制信号,由always敏感表列监控(或者在always内部使用if语句控制是否赋值),以此保证inout端口作为输出时不会影响DataIn。

inout类型端口在使用时,需要将读取和写入分开,读取inout的数据需要设置一个reg作为缓冲。

  • 当写使能信号有效时,将写数据赋值给inout端口。否则(读使能有效)将inout赋值为高阻态Z。
  • 当读使能有效时,inout端口为高阻态Z并接收来自RAM的数据,然后inout端口将RAM的值赋给cpu_sram_rdata(reg)。
assign ram_data = ~ram_we_n ? cpu_sram_wdata : 32'hz;
always @(posedge clk or negedge resetn) beginif (resetn) begincpu_sram_rdata <= 32'hz;end else begincpu_sram_rdata <= ram_data;end
end

Vivado生成Bit流文件时出现[Synth 8-91] ambiguous clock in event control

时序逻辑的always块,某个信号沿作为触发条件,但是却没有在always块中使用该信号的话,在生成bit流文件时就会出现此类错误。

// 错误
always@(posedge clk_10M or negedge locked) beginreset_of_clk10M <= ~locked;
end
// 正确
always@(posedge clk_10M or negedge locked) beginif(~locked) beginreset_of_clk10M <= 1'b1;end else beginreset_of_clk10M <= 1'b0;end       
end

RAM字节使能的使用

  • 控制信号有3个,以BaseRAM为例,分别是Base_RAM_EN、Base_RAM_OE和Base_RAM_WE。
  • RAM芯片上还有字节使能信号RAM_BE_N[0…3],低电平有效,分别用于使能32位数据线的四个字节 [7…0] [15…8] [23…16] [31…24],当字节使能信号对应位为’1’时,相应的字节输出为高阻态’Z’。(本文中设置为4’b0000即可)
  • 从时序要求上看,读取SRAM时要提前准备好地址,并将数据线设置成高阻,然后就可以读出数据了;写SRAM时要提前准备好地址和数据,然后将写信号拉低即可将数据写入相应地址。

| 运算

x=10001001
|x <==> 1|0|0|0|1|0|0|1
| cpu_sram_we && cpu_sram_en
当RAM使能有效,且4位的we信号中只要有1位为1,那么表达式就等于1

参考资料

[1] CPU设计实战(汪文祥)第一、二、三、四章
[2] 龙芯架构32位精简版参考手册
[3] 龙芯杯历届资料
[4] Loongarch个人赛指令集
[5] 自主龙架构CPU设计实验平台
[6] Verilog中双向端口(inout)的原理和使用方法
[7] 计算机组成原理(2021年)实验3 SRAM 实验

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

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

相关文章

file zilla server安装以后,client连接,账号登录成功,但是读取目录失败的处理

1、下载 2、连接 开始一直报错&#xff0c;server1.9.1的版本&#xff0c;后来直接下载了汉化版本进行安装&#xff1a; 服务端 - FileZilla中文网 3、报错&#xff1a;登录正常&#xff0c;但是读取目录失败&#xff0c;一开始也是这个错误&#xff0c;后来改成安装低版本的&a…

python之装饰器、迭代器、生成器

装饰器 什么是装饰器&#xff1f; 用来装饰其他函数&#xff0c;即为其他函数添加特定功能的函数。 装饰器的两个基本原则&#xff1a; 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式 什么是可迭代对象&#xff1f; 在python的任意对象中&#xff…

Mac使用技巧-来自苹果专人在线辅导服务3

真的太喜欢上苹果专人在线辅导课程了&#xff01;每次感觉都满满收获&#xff01; 目录 一、手势 1.1三指拖移 1.2四指上推 1.3五指快速进入启动台 二、程序坞里的app 1.如何将程序坞中不需要/不常用的app移除&#xff1f; 2.当鼠标放在将程序坞中app时&#xff0c;图标…

到底该不该做副业?这些真相你必须知道!零基础入门到精通,收藏这一篇就够了

天哪&#xff01;根据最新调查显示&#xff0c;超过60%的职场人士正在考虑或已经开始从事副业。 那么&#xff0c;究竟该不该做副业&#xff1f; 第一部分&#xff1a;副业的好处 1. 增加收入 做副业最直接的好处就是可以增加收入。 在经济压力日益增大的今天&#xff0c;…

STMCubeMx——C8T6的串口调试、接收与发送

一、stmCubeMX串口通信的步骤 1、新建一个文件&#xff0c;选择自己的芯片 2、配置时钟 3、配置串口 串口的模式解析可以跳转到以下文章查看 stmCubemx——配置串口时的几种模式-CSDN博客在STM32CubeMX中配置串口&#xff08;USART或UART&#xff09;时&#xff0c;可以设置…

Python连接Kafka并收发数据

目录 一、Kafka 二、发送端&#xff08;生产者&#xff09; 三、接收端&#xff08;消费者&#xff09; 一、Kafka Apache Kafka 是一个开源流处理平台&#xff0c;由 LinkedIn 开发&#xff0c;并于 2011 年成为 Apache 软件基金会的一部分。Kafka 广泛用于构建实时的数据…

soul怎么改ip地址归属地

在数字化时代&#xff0c;社交应用已成为人们日常生活中不可或缺的一部分。Soul&#xff0c;作为一款深受年轻人喜爱的社交APP&#xff0c;以其独特的灵魂社交理念和丰富的互动功能吸引了大量用户。然而&#xff0c;在使用Soul的过程中&#xff0c;不少用户会关注到一个问题——…

详解Web测试和APP测试的区别

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近听到有些朋友说&#xff0c;移动端要比web端稍微难一些&#xff0c;涉及到的细节笔记要多&#xff0c;有转去做web测试的想法&#xff0c;看看在具体测试的…

华为全联接大会2024 | 一文回顾华为云开发者联盟重磅干货

目录 华为开发者空间预置更多工具资源&#xff0c;带来丰富场景案例 携手鲲鹏、鸿蒙、昇腾等根生态&#xff0c;使能开发者创新 学习体验、内容体系全面升级&#xff0c;助力开发者高效学习根技术 参与丰富线上体验活动&#xff0c;赢取精美礼品 在刚刚结束的华为全联接大会…

基于Netty框架的云快充协议+云快充1.5协议+云快充桩直连+桩直连协议

云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 介绍 云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 软件架构 1、提供云快充底层桩直连协…

智能Ai语音机器人的应用价值有哪些?

随着时间的推移&#xff0c;人工智能的发展越来越成熟&#xff0c;智能时代也离人们越来越近&#xff0c;近几年人工智能越来越火爆&#xff0c;人工智能的应用已经开始渗透到各行各业&#xff0c;与生活交融&#xff0c;成为人们无法拒绝&#xff0c;无法失去的一个重要存在。…

Java项目: 基于SpringBoot+mybatis+maven医疗病历交互系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven医疗病历交互系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

全球网安行业缺少350万安全专家? 志愿你别乱填,缺的是专家,不是0经验的牛马

0x00 首先是这个所谓的“高需求”。企业们天天喊着缺人&#xff0c;但当你打开招聘网站&#xff0c;看到的全是“三年经验起步”、“高级专家”。黑人问号&#xff1f;这是在逗我吗&#xff1f;都只想要高级专家&#xff0c;拒绝新手及应届生&#xff0c;没有新手&#xff0c;哪…

舒服了!学大模型必看的学习书籍来了

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01;&#xff08;文末获取&#xff09; 部分书…

用于体积医学图像分割的跨视角差异依赖网络|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Cross-view discrepancy-dependency network for volumetric medical image segmentation 用于体积医学图像分割的跨视角差异依赖网络 01 文献速递介绍 医学图像分割的目标是通过为每个像素分配语义类别&#xff0c;从原始图像中描绘出受试者的解剖结构&#x…

Activiti7《第九式:破气式》——流畅驱动工作流进程。面试题大全

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。“破气式”&#xff0c;代表着工作流中的 无形之力&#xff0c;它是贯穿整个流程的 关键驱动 不知不觉已经到了独孤九剑最后一式了&#xff0c;我相信到这里之后各位都已经出神入化…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 10 推送实况窗消息

场景介绍 实况窗是一种帮助用户聚焦正在进行的任务&#xff0c;方便快速查看和即时处理的通知形态。有关实况窗简介、权限申请、开放场景、设计规范等说明&#xff0c;请参见Live View Kit简介。 通过Push Kit发送的实况窗消息支持三种操作类型&#xff0c;分别是&#xff1a…

云手机推荐:五款热门云手机测评!

在云手机市场中&#xff0c;各个品牌层出不穷&#xff0c;让人难以选择。为了帮助你更好地找到适合的云手机应用&#xff0c;我们整理了五款最受欢迎的云手机进行测评。2024年&#xff0c;哪款云手机是你的不二之选&#xff1f;且慢下结论&#xff0c;看看这五款云手机的真实表…

分享一个非常好用的图片压缩的免费网址,及使用方式

一、图片压缩网址&#xff1a; TinyPNG – Compress WebP, PNG and JPEG images intelligently 二、使用方式&#xff08;压缩后的图片在1M以内&#xff09; 1、上传图片 二&#xff0c;下载压缩图片 备注&#xff1a;只能免费压缩5M以内的图片&#xff01;

Codigger SIDE:Nvim扩展,重新定义编程体验

在当今快速发展的科技时代&#xff0c;软件开发的核心工具之一——代码编辑器&#xff0c;正变得越来越强大和多样化。Codigger&#xff0c;作为新一代的软件开发平台&#xff0c;不断推动着编程工具的创新。其中&#xff0c;Codigger Super IDE&#xff08;SIDE&#xff09;的…