6.2【A】

发布时间:2026/6/4 22:18:53

6.2【A】 DEBUG就是说对于一次读请求当AR通道完成读地址的握手后slave端开始查找查找的过程中AR通道就空了然后当slave查找完毕的时候查找到的数据不知道返回给谁即返回到的地址是哪是吧那原来的处理逻辑是怎样的什么是outstanding?以及当R通道返回读数据后那怎么知道这个数据该写到cpu的哪里呢所以现在修改的逻辑就是对cpu araddr原来是wire类型现在改成reg类型这样的话就能保持值是吧即AR握完手后就在R通道上等待slave传回数据当R通道传回数据crossbar接收后要根据锁存的reg即这个请求对应的设备返回到cpu?这里不是1x2的crossbar吗所以不论哪个设备传回来的数据不都是要返回到cpu?那锁存的到底什么有什么用3633雷霆题按开始时间游玩时间排序从小到大最好的就是采取两个里面不冲突的方案不过复杂度好像和on^2差不多直接朴素的话就是对于陆地的每种方案算出其结束时间然后再遍历水上的判断是否冲突最后取一个max如果排序的话可能就省去全部遍历的过程就是找到第一个不冲突的即可但这样排序的话要排序四个数组还是比较麻烦的或者就是对下标进行一次排序即可只对下标排序应该是可行的但是这个判断不冲突的逻辑其实也就是两个事件的区间不能有重合先判断左端点左端点小的那个其右端点不能超过大的那个的左端点这个测试点比较麻烦因为一开始没想到如果真的存在重叠时那么第二个事务的开始时间就无法确定不过处理比较简单或者说巧或者笨、直接就是如果真的重叠的话那么另一个事务的结束时间就是下一个事务的开始时间即第二个事务的起始时间是max(FirstEnd,SecondStart)这是固定第一个事务就必须在第一个完成为前提的即如果第二个它开的很早而且结束的也早那么在这个前提下也会使开始时间被强制延后到FirstEnd所以在一个遍历即i,j组合当中要尝试让i和j的事务交替去成为那个被固定第一个要做的事然后取他们当中结果的最小值测试cd ~/project/learn/cpu/LoongArchProject-iverilogscripts/coe2hex.sh func_test/func_test/func/obj/inst_ram.coe build/axi_ram.hexscripts/build_func.shvvp build/func_tb.vvp loadmemcache意思就是说原来是不管地址的形式就是什么样的内存地址都统一放进一个桶当中然后查找的时候就是用比较器去并行的查找桶里的所有数据如果有那就返回数据否则就进行cache替换然后直接映射就是说按地址样式去把它分到不同的桶当中比如32位的地址如果把前4位当成桶标识那么就会有2^416个桶当来新地址后就去对应的桶里去查找不过这样的话还有剩余的28位还是得知道一个桶里能放多少个数据然后用那么多的比较器去并行的查找那对于全相联就是说它的比较器数量就是它能缓存的所有cache行的数量吗即如果cache总共能放1024个数据那全相联时就需要1024个比较器然后对于直接映射它桶的数量取决于访存地址本身也即必须是2^n个即这样的话cache只能存放24816...等的数据然后cpu来数据的时候就是直接看比较的那个选取前几位地址如果对应的cache栏位上放的是这个数据那就是命中了否则就没命中什么叫字内字节偏移一个方寸地址找到的不就一个字即32位数据吗也就是说现在拿来进cache的32位地址就是在内存当中唯一对应一个32位的数据就是1字那“byte addr[1:0] 用于字节/半字访问的偏移尤其是 store 写掩码。”的说法是怎么来的什么是按字节编址还有一种编址方式是什么忘了机制是什么‘那对于lwsw等读写地址的请求在一个访存地址只是对应其中一个字节即8bit的话那岂不是如果要获取32位数据要发出4个地址以及是否有可能lw在发起读请求时对应的那个字节不是要返回的数据的第一个Byte?比如第二个byte?这样会出问题吗那如果是按字节编址的话当按这个地址去内存取数据时是怎么取的是一个字节一个字节取对于cache有2^532个桶然后每个桶里要存23位比较tag有四路即一个桶里要放四个数据对于一路的情况要23tag1有效标志1脏位25控制Bit然后对于这个地址所存的数据就是1字是4字节32bit也就是说是要有253257那四路就是57*4228位然后一共有32个桶所以占32*228的bit所存储的数据量就是32*4块大小为什么是固定的就是说为什么32位的指令集所对于的cache行即cache和cpu交互时交换的数据粒度就是128位就是对应地址上的最后4位那完整的流程就是先通过中间5位Index找到对应的桶然后因为是4路所以桶内放了4个数据4个字然后桶内并行地比较其前23位tag现在每个cache line,就是一个cache块是放了4个字即4*32128位就是说对比完23位tag后锁定的是几个字一个桶内放的数据是什么cache line ,cache块都是什么关系就是说Index找到桶后每个桶内放的都是cache line然后因为是4路所以每个桶里放的是4个cache line先确定tag的位数5位index确定的是桶的数量即2^532个桶然后按字节编址当前是32位一个字所以要用2位来表示字内偏移即把1个字32位拆分出4块每块都是一个字节也就是每个访存地址都能唯一索引到一个字节然后要保证是64B的cacheline现在一个字是32位4B所以一个cache line要装16个字所以需要2^4即[5:2]位那么最后tag位就是32-5-4-221位通过并行比较tag找到可能存放数据的cache line之后再串行比较cache line当中的word标识来寻找cache line当中是否存在当前的数据吗就是说一个cache line本身存放的就是地址连续的一段数据那当发生未命中时就是说是在桶内寻找时那些tag都没有命中所以就要去发生替换选中某个cache line要替换时如果是dirty就要写回内存否则就直接舍弃被覆写当要发生写回时就是要把这个cache line开头的那个字开始连续的那些字都写进内存里那cache存储大小首先是桶的数量为2^index个然后是cache line的选择即要放几个字一个cache line要放2^word个字最低两位4个字节确定一个32位的字现在说是n路所以每个桶里有n个cache line然后每个cache line里有2^word个4B的字所以一个桶的大小是n*2^word*4然后一共有2^index个桶所以cache的总大小是n*2^word*2^index*4B其中,n路是可以调的一个cache line里的字的数量即word是可以调的然后桶的数量index也是可以调的如果要充分利用开发板资源该如何合理调整参数cache实现这里是说当时钟发生跳变时在4个桶每个桶里4个cacheline然后每个cacheline里4个字都要被读出来即只读一个字的情况下都要同时从所有cacheline里的所有字里出来取16个字出来因为有2^532个桶所以对于每个桶里的四路即way0,way1,way2,way3都要创建相应桶数量的个数Cache状态机这个就是cache命中时的情况即先是要以vaild和tag匹配来得到watHit信号确认出miss0后等进入寄存器逻辑完成赋值对于wen写使能是要锁存的在时序逻辑中存在使该时刻的组合逻辑算出来的写使能锁存进wen_当中wen计算的组合逻辑就是判断命中了哪路然后再看是该cacheline上的哪个字不过对于cache的写入我知道在a时刻通过判断知道了要找的地址在cache当中然后锁存保存了要写入数据的状态然后在a时刻的下一个时刻完成cache上实际数据的更改不过dirty位不是在a1时刻写的而是在a时刻即发现数据在cache上时就写的不过在a时刻结束时锁存也使data_ok被锁存为1也就说明cpu在a1时刻就认为数据已经被写入了但a1时刻数据才要被写入这样没问题吗这个向内存发出的16Bcache line的读取具体是如何完成的是按顺序发出的访问吗即比如现在cpu访存的字是a那么cache在Miss时是先a然后a1a2,a3的字这样就是说期间是会一直等待直到这个字被返回获得吗会先发出请求即不是等a返回响应后而是在等待期间就直接发出a1甚至a2的请求以及返回响应时也可能不是按顺序的a1的先到达这样就是说要找的字是A的话那么访存的那个第一个字不一定是A而是看A所在的那个组这是靠把最低4位全置0实现的那对于AXI Burst的请求事务就比如读能否设计成不是按乱序返回的即beat1可能会比0先到这样如果这样设计能否加速即减少了顺序返回时等待的时间对一个AXI burst 内部来说通常不能让 beat1 比 beat0 先返回。优化TODO——cache早停AXI Burst请求什么是AXI burst请求就是一次发出多次请求合并在一起的那种请求吗即alen1的那种请求吗周期对于上升沿比如有A,B都要在上升沿被修改其中A要被改为c然后B是要被改为A即A在上升沿时是组合逻辑算出来的值然后A本身被锁存B在上升沿时是读取A锁存的值那么假设A有旧值a在上升沿来后有新值c那B在相同的上升沿时读取且覆写的值是a还是cccswitch

相关新闻