Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

所以您写的这个读没有用到掩码,是因为在总线中利用掩码产生了正确的读数据,这样理解对吗? #12

Open
doubletpy opened this issue Aug 9, 2021 · 1 comment

Comments

@doubletpy
Copy link

我想请问
1.为什么ram读数据时地址要减去64'h0000_0000_8000_0000
2.ram的代码中读数据时不需要考虑是lb,lh,lw等等的这些吗,我看是直接读64位的

  1. 因为RAM中的数据是加载的objdump从elf可执行文件中生成的bin文件,可执行文件中从虚拟地址64'h0000_0000_8000_0000开始重定位,分配地址,而bin文件中将指令和数据从0开始放置。举个例子,int a = b[0]假设需要lw指令将b[0]的数据从内存中加载到寄存器里面,当我们生成可执行文件后,在链接的时候会进行重定位,根据规范,编译器会假设这个程序放置在从虚拟地址64'h0000_0000_8000_0000开始的一段空间,然后我们根据b[0]在数据段中的偏移和64‘h8000_0000这两个数可以计算b[0]的虚拟地址,最后填写到lw指令中,当你自己写的CPU运行到该指令时,会很自然地想要读取RAM这个地址(大于0x8000_0000)的数据,本来按照正常情况,这个地址确实应该有你想要的数据,但是我们bin文件是假设数据从0开始放置的,所以就需要你转换一下,减去0x8000_0000。
  2. 所以需要根据lb、lh和lw生成对应的控制信号——mask掩码来选取64位数据中自己想要的数据,当你编写Axi总线的时候,也要提供这样一个信号的。

Originally posted by @codefuturedalao in #9 (comment)

@doubletpy doubletpy reopened this Aug 9, 2021
@codefuturedalao
Copy link

读也需要掩码这个控制信号,不然你取出一个64位数据后怎么知道哪一部分是自己想要的呢,举个例子,lb的目标地址为5'b11001,然后呢你要传给RAMHelper一个8字节对齐的地址,也就是(5'b11001 >> 3)即2'b11,之后RAM取出8个字节给你,分别是5’b11000、5‘b11001、5’b11010 ......处的数据,你需要在decode时生成信号决定取出数据后,哪一个或哪一些字节是你需要的,这个不用传给RAM,只要自己取出来数据知道哪些字节写到寄存器里面即可😀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants