6.4aaaa
3751最简单的就是直接遍历不断取出每个数然后和旁边的两个数去比较如果都大于或都小于那就是可以的优化的话感觉可以归并对于归并的话就是拆成左右两半后看mid和mid1对于mid就是看mid-1和mid1上的数是否都大于或都小于对于mid1就是看mid和mid2上的数是否都大于或都小于然后由于第一个和最后一个都不能是所以当区间长度为12时就直接返回0这样判断一个数的波动值的复杂度就是logn整体的复杂度是mlogn又或者可以直接构造构想枚举每个数位上的每个数对于三位数在不限制的情况下如果中间位数上的数是x那么左边共9个右边共10个选比x都小的设有a个感觉能构造但是逻辑暂时没想明白寄存器冒险冲突ROB寄存器重命名什么叫通过寄存器重命名消除什么是重命名解决机制是什么寄存器CSR异常debug2debug1为什么说ESTAT很有信息量”bit1 软件中断 pending 已经在了但 Ecode 还残留着之前 n50 非法指令异常的 0xd“什么意思什么叫bit1软件中断pending已经在了”中断 pending 置上了但 CPU 没有及时把它作为中断异常接走“又是什么意思我知道ERA是异常指令处理完后pc的返回指令但CRMD 00000008和PRMD 00000004是什么意思int_ex是什么意思?什么叫只看CSR文件当前值”但 csrwr ESTAT 到 WB/负沿才真正更新 CSR。等 int_ex 变高时后面的 b 0 已经进了后级甚至提交了“什么叫b 0已经提交了什么是自旋分支b 0?什么是软件中断pending位bit1是什么东西如果发现了异常指令在ID阶段它产生了异常label信号不是到下一拍即EX阶段才会由label信号产生出ERA等各种信号吗那ERA是如何知道取出异常指令时的pc的呢以及是如何知道要跳到异常入口1c008000?bitx意思就是第几个x上的二进制是吧那是指谁的第几位以及DA,IE等名词都是什么意思为什么进入异常后DA要保留而IE要被清除掉以及PRMD是什么要保存进入异常前的IE为什么说ESTAT[1]被置上软件中断请求就来了意思是int_ex才是那个是否触发中断异常的信号但中断异常不是指令吗即由指令来触发的中断与异常这个内部信号到底是干嘛的即内部还说要是否触发中断与异常异常指令前面在写CSR寄存器写ESTAT等各种寄存器时不就是在触发中断异常吗以及int前缀是什么意思vet是什么意思这里当有异常指令时不是会产生flush信号来洗掉新指令吗为什么说还有b 0进入流水线甚至还能到写回阶段即异常指令肯定是比b 0要先执行完的怎么还会有这个问题------------------------当int_ex为1时但是要明白什么时候Int_ex为1即int_ex在哪个阶段可能被置为1比如来了一条可能引发中断或者说想要触发中断的指令那它是到写回阶段才可能使int_ex为1吗那说当作ID_int_ex是说相当于又向此时的流水线注入了一条直接触发中断的指令是吧fixCRMD/ECFG/ESTAT/TCFG/TICLR当中分别都有哪些信息int_ex生效是如何生效的生效后的过程是怎样的对于解决方式1暂停流水线F/D即stall信号是如何发挥作用的以及flush给E插bubble就是说“assign stallE old_stallE; // 不停 E让 CSR 指令继续往后走”是什么机制这怎么就不停E了以及FlushE,后面的判断说是E不暂停而且是要写csr那为什么就要flush了stallE不是说ID2EX不更新吗当判断出是要写CSR那不已经到了E阶段那不停E不应该是不去stallM,即EX2ME阶段吗那如果这样理解的话E阶段上写CSR的指令进入到MEM阶段然后ID2EX的行动被stall了那下一拍的EX指令是什么即从ID来的指令已经被stall了那应该直接是空的了吗“如果只 stallD1但不 FlushE下一拍 D 里的 b 0 仍可能被送进 E。这样 b 0 就跑掉了。”都stall了为什么E取值还能取到对于解决方法2这个是否就是和解决RAW等冒险冲突一样能提前旁路那如果是t0阶段csrwr要呼唤一次中断t1阶段是其它的指令a如果真能旁路即方式二那么t1时刻csrwr走到ID也没产生出相关的中断异常信号a完成了IF阶段等t2阶段csrwr被旁路又或者ID时即t1时刻csrwr就可以被旁路然后触发了Int_ex那就相当于要把ID阶段即此时的指令a当成异常指令来执行但一方面a毕竟是普通指令怎么能被当成异常指令来执行这样真的没问题吗那对于非法指令异常比如syscall,break等直接触发中断的指令其ERA也是自己的pc吗那这样ERA的语义不就乱了吗难道这类直接触发中断的指令在执行完中断后也要再回到自己继续执行意思就是说ERA只是负责保存当时的pc地址如果是正常的指令那就不4如果是主动触发异常的指令那是由编译器负责产生的额外指令即要求再csrrd t0 csr_era后面固定跟一条pc4的指令来越过当前的异常指令但如果万一真的没有那个pc4指令呢那如果syscall真的因为没有add i 4陷入了死循环那怎么打破呢以及对于精确异常的概念如果是由Int_ex执行的中断是否也会清理掉新指令即IF阶段的指令但是b怎么能被清除呢是最初的csrwr指令呼唤的中断那怎么能保留a而清掉b呢因为看上去a和b的地位是一样如果清掉b那b还执不执行因为a和b都是正常指令啊意思就是说a虽然是正常指令但被Int_ex打上异常标签后实际上也不会被继续执行了可以认为只承载异常信息的bubble了相当于也被flush掉了b也要flush掉只是此时的流水线不再处理a和b了而是要处理异常中断程序里的指令ABCDE了等他们都处理完后再csrrd回来继续流水线处理abchange这个写值计算函数是什么意思addr_w_hcode是什么?hcode是什么以及这个写csr的掩码计算addr14h5的这些值是怎么来的csr_next_value是怎么计算出来的原来的rf[14h5],[14h4]等都是什么意思以及rf[14h0]reg [31:0]rf[387:0]是什么意思是说有32个388位的寄存器吗这个388是什么特殊的含义example测试配置要跑的测试./configure.sh --run func/func_lab3 --output-uart-info第一次完整编译运行make -j8改了 RTL 后通常不用重新编译软件可以跑make verilator testbench simulation_run_prog -j8只想重新跑仿真不重新编译 RTL/testbenchmake run改了 func 软件或想强制重编软件make clean_soft make -j8nscscc流水线“根据 CSR 的 DA/PG/DMW/TLB MAT 判断是否 uncache”什么叫是否Uncache?DMW,PG以及TLB MAT都是什么分支预测的完整机制是怎样的对load/store/CACOP/PRELD计算虚地址是如何计算的指令本身不就自带一个地址吗那个地址不是虚地址吗END