<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>CRZ&#39;s Blog</title>
  
  
  <link href="https://crazyinloo.github.io/atom.xml" rel="self"/>
  
  <link href="https://crazyinloo.github.io/"/>
  <updated>2026-08-12T17:22:46.262Z</updated>
  <id>https://crazyinloo.github.io/</id>
  
  <author>
    <name>Lee</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Crossover使用说明</title>
    <link href="https://crazyinloo.github.io/2026/08/11/crossover%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/"/>
    <id>https://crazyinloo.github.io/2026/08/11/crossover%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/</id>
    <published>2026-08-10T16:00:00.000Z</published>
    <updated>2026-08-12T17:22:46.262Z</updated>
    
    <content type="html"><![CDATA[<h1 id="安装普通-exe-程序">安装普通 <code>.exe</code> 程序</h1><h2 id="单独创建瓶子">单独创建瓶子</h2><ol><li>点击安装后，点击右上角的安装未列出应用</li><li>选择下载好的 <code>.exe</code> 安装文件；</li><li>选择容器：<ul><li><strong>Bottle Name</strong>：随意，例如软件名称；</li><li><strong>Bottle Type</strong>：选择合适的 Windows 版本即可；</li></ul></li><li>安装。接下来会弹出 Windows 软件自己的安装界面，像在 Windows 上一样正常执行安装即可。</li></ol><p>安装结束后，CrossOver 通常会自动生成软件图标，之后直接从对应瓶子中启动即可。</p><h2 id="安装进已有瓶子">安装进已有瓶子</h2><p>例如某个 <code>.exe</code> 是 Steam 游戏需要的补丁、组件或附加程序：</p><ol><li>选中目标瓶子，例如 Steam；</li><li>选择 Install Application into Bottle；</li><li>后续同上</li></ol><p>这样安装程序所写入的文件、注册表和 Windows 组件都会进入这个 Steam 瓶子。</p><h1 id="文件管理">文件管理</h1><p>以steam中游戏的文件替换为例：</p><ol><li>打开 <strong>CrossOver 主界面</strong>；</li><li>左侧选中安装 Steam 的瓶子；</li><li>点击 <strong>Open C: Drive</strong>。</li></ol><p>Finder 打开后，进入steam，按以下路径选择即可</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Program Files (x86)</span><br><span class="line">└── Steam</span><br><span class="line">    └── steamapps</span><br><span class="line">        └── common</span><br><span class="line">            └── 游戏名称</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;安装普通-exe-程序&quot;&gt;安装普通 &lt;code&gt;.exe&lt;/code&gt; 程序&lt;/h1&gt;
&lt;h2 id=&quot;单独创建瓶子&quot;&gt;单独创建瓶子&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击安装后，点击右上角的安装未列出应用&lt;/li&gt;
&lt;li&gt;选择下载好的 &lt;code&gt;.exe&lt;/cod</summary>
      
    
    
    
    <category term="杂项" scheme="https://crazyinloo.github.io/categories/%E6%9D%82%E9%A1%B9/"/>
    
    
  </entry>
  
  <entry>
    <title>At the End of the World</title>
    <link href="https://crazyinloo.github.io/2026/08/08/At%20the%20End%20of%20the%20World/"/>
    <id>https://crazyinloo.github.io/2026/08/08/At%20the%20End%20of%20the%20World/</id>
    <published>2026-08-07T16:00:00.000Z</published>
    <updated>2026-08-12T16:34:07.739Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言">前言</h1><p>关于世界征服，本篇采用了一些私设：</p><ol><li>费加罗和奥兹在开始世界征服之前已经有了自己的住所；</li><li>世界征服开始于密斯拉未满百岁之时，即约 1500—1400 年前。</li></ol><h1 id="正文">正文</h1><p>奥兹还在世界征服。</p><p>听说它最近在央国大开杀戒呢。</p><p>要不要趁奥兹在外地去袭击魔王城堡？这家伙周游世界，想必又攒了不少好东西。</p><p>不过，那个没品味的奥兹，说不定根本认不出来一路上遇见的宝贝，把玛那石一顿啃完，就又去赶下一个场子了。世界上最无趣旅行者的称号可以让给它。整天和奥兹作伴四处横行，光是想想都后背一凉啊，也只有费加罗这种恶趣味的家伙有心思跟着它转了。它倒是比奥兹识货些，但我宁愿去闯双子的结界，也没兴趣拜访费加罗的家，装模作样的，屋随其主，远远眺一眼就想掉头。</p><p>算了，我可不像奥兹那么闲。我一要守着我的船按时上岗，二要收集散落的古籍精进咒术，三要补充高品质玛那石提升力量……天呐，怎么有这么多事等着我去做。但是为了迎战奥兹，我必须加快训练的节奏才行。</p><p>世界征服，最后一站，肯定要来死之湖吧？</p><p>我还没和任何人聊过这个话题，只是，没有征服过我的领土的话，算什么世界征服啊。等到奥兹走完一圈世界，最后来到死之湖，向我正式宣战，我再用早已今非昔比的魔力将它击溃。奥兹的玛那石是什么味道的呢？我一定会尝到的。啊啊，好完美的结局。</p><p>在这之前，还是不去城堡找麻烦了。最好也别向切雷塔透露计划，总感觉那个人去双子家串门时会聊漏嘴。等我真的打败奥兹之后，它可再没有借口把我当小孩敷衍了。</p><p>于是就这样，一个人探险，一个人历练，过了数百年。切雷塔有时会来找我玩，不过它呆不了多久就会去找下一个乐子；我也不觉得无聊，试想，有这样一个美梦近在眼前，再怎么无欲无求的人也会感到愉悦吧。</p><p>在雪原里被不知名的远古巨兽按倒在地、闲来无事抱臂躺在船上望天、又一次独自吞下新鲜玛那石……有那么多契机让我完善脑海里的画面。奥兹是会推门闯进我的小屋，还是一杖敲碎我的湖面？费加罗多半会替它谋划最后一战吧，至于奥兹听不听，又是另一回事了。不理它也好，这一战，一定要只属于我们两个才圆满，奥兹嘛，堂堂正正决斗的决心总还是有的。</p><p>切雷塔还是知道了我的计划，但它这次没像以前那样笑得那么过分，我觉得它是被我独自升级的效率打动了。等事成之后，分一块魔王的玛那石给它也不是不可以；不管是前世界第一的玛那石，还是前追求对象的玛那石，切雷塔肯定都感兴趣。</p><p>可是，什么叫奥兹结束了世界征服？</p><p>谁允许它在前来挑战我之前停止世界征服？</p><p>我甚至是在梦之森和欧文玩的时候才被告知了消息。顺带一提，欧文也知道我的计划，等回来再找它算账，那副得意忘形的嘴脸，这次真是格外让人烦躁。</p><p>我觉得我有必要去要个说法。连一千年都坚持不到，还有什么资格做世界第一……</p><p>直接空间移动到奥兹的城堡门前。一打开传送门，厚重的风雪压着空气卷来，暗沉中，还没来得及动手闯入，倒是撞上了奥兹的帮凶。那个人，被奥兹拒之门外了啊。</p><p>不管它，现在就进去。</p><p>“密斯拉，别去打扰奥兹了吧。”</p><p>奇了怪，费加罗今天居然主动招惹我。它要找我打，我也不是不能奉陪，但不是今天啊。</p><p>我没理它，径直向大门走去。</p><p>“ポッシデオ。”</p><p>我闪身躲开。为什么没一件顺心事呢？几百年的余韵，仿佛一霎就被冲毁了。</p><p>“费加罗，别来打扰的是你才对吧。我可不会任由自己被拒之门外。”</p><p>它没说话。</p><p>雪一直落，要把世界淹没似的。</p><p>我明白进门前必有一战了。</p><p>召唤出魔道具，骷髅眼窝中准备燃起火焰，身侧的风雪忽然一乱，另一道声音传了过来。</p><p>“密斯拉，今天先回去吧。”</p><p>切雷塔也来了？</p><p>“你也来拦我。”</p><p>“嗯。”</p><p>“到底为什么？”</p><p>切雷塔停了一下。</p><p>“因为你现在进去，也得不到你想要的东西。”</p><p>它知道我问的不是我为什么不能进去。切雷塔明明知道的。</p><p>但是，好吧。</p><p>纷飞的雪花劈头盖脸地砸下来，我看着紧闭的大门，又看了看这俩没出息的门神。一个不说话，一个没有笑。如果我执意进去，这两个人都不会手下留情。</p><p>更重要的是，即使进了门，奥兹也不会重新开始世界征服了。我有这种感觉，就在刚刚这一瞬。</p><p>骷髅眼窝里的火焰熄灭了。</p><p>它怎么能放弃呢？</p><p>我转身踏进传送门，临走前又回头看了一眼。风雪把城堡遮得严严实实，仿佛无人居住其中。</p><p>算了。等奥兹哪天重新想起来，世界上还有一个地方没有被它征服，自然会来死之湖找我。</p><p>我等着就是了。</p><h1 id="后记">后记</h1><p>没有人关心但是本质上是一篇世界征服压抑产物（</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;关于世界征服，本篇采用了一些私设：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;费加罗和奥兹在开始世界征服之前已经有了自己的住所；&lt;/li&gt;
&lt;li&gt;世界征服开始于密斯拉未满百岁之时，即约 1500—1400 年前。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id</summary>
      
    
    
    
    <category term="产出" scheme="https://crazyinloo.github.io/categories/%E4%BA%A7%E5%87%BA/"/>
    
    
  </entry>
  
  <entry>
    <title>Just Another Day</title>
    <link href="https://crazyinloo.github.io/2026/08/02/Just%20Another%20Day/"/>
    <id>https://crazyinloo.github.io/2026/08/02/Just%20Another%20Day/</id>
    <published>2026-08-01T16:00:00.000Z</published>
    <updated>2026-08-12T16:35:01.384Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言">前言</h1><p>提前谢罪把王子大人写漏了TT</p><h1 id="正文">正文</h1><p>贤者大人张罗着要给这届魔法使们拍张合影。</p><p>最早赶来的是米契尔和央国的小家伙，叽叽喳喳地围着贤者，合照还没个影，就计划着等会儿要怎么交换相机互拍。</p><p>听起来就麻烦。</p><p>我可不要留下陪你们玩，贤者大人也不准被耽搁，早早陪我上床睡觉才是正事。要不是这人一脸可怜鬼缠身的衰样，小型犬一样追着我保证，我才不会这么早就坐在水池边，什么事也不做，干等着那些散漫的家伙一个个出现。</p><p>刺耳的风从上空划过，溅出几簇水花洒在我肩上。不用抬头也知道，南国的迷糊鬼骑扫帚赶到了，大个子和费加罗也随后跟来；东边那四个倒是安静，结伙一起从魔法舍走出来，又一起钻进树荫下，不声不响地等着；央国的小子和奥兹并肩往这边行来，天哪，它又在拍奥兹的肩膀。跟奥兹勾肩搭背是什么感觉？想想都有点犯恶心，都怪奥兹，好想决斗。</p><p>不行，为了今晚，暂且让它一回。</p><p>我移开眼。西国的烦人鬼们也到了，这下烟花声、笑声、不知道谁领头唱起来的歌声全部混杂在一起，简直吵死人了。</p><p>所以说，到底为什么突然要拍照啊，贤者大人，又是那个世界的什么奇怪节日吗？</p><p>“诶，不是为了什么纪念日啦，只是，なんでもない日也可以聚在一起做些什么，这就是伙伴呀，密斯拉。况且这也可以作为留给下一任贤者的资料嘛！”</p><p>抱着头，手臂微微压住耳朵，在池边躺下，不知怎么又想起它的回答。明明最后一个来也没影响，让贤者一个人在那招待就是了，而不是现在这副傻样，把主动权递给还没来的人。但说不清为什么，那家伙一边笑着，一边牵着我的手，回过神来的时候，我已经坐在了水池旁。</p><p>“呀，密斯拉。”</p><p>黏糊糊的声音从头顶落下。</p><p>“你居然会老实等人？”</p><p>是欧文拉着布拉德利，一副亲亲热热的模样。那双异色的眼睛往前面的相机上一瞥，忽然眯了起来。</p><p>“看见了吗，布拉德利？下次试试用这个对付它怎么样？它脑袋笨，同时处理不过来两件事的，这边因为拍照晃了眼，那边就顾不上杀你了哦。”</p><p>看起来那么好说话的人，嘴里吐出来的东西怎么这么难懂呢？总感觉，这人又意有所指。</p><p>完全听不明白啊。它俩自己估计还要纠缠半天，等会儿再想吧，反正它们也打不过我。</p><p>“贤者大人，快开始吧，总算到齐了。”</p><p>我坐起来，伸伸懒腰，没理会旁边人的怪声怪气。</p><p>北国的双子总算到了，两个人你一声我一语，腻乎得像甜蜜的脓——欧文总爱这么形容，现在听来倒很合适。倚老卖老的家伙，居然让我等了这么久。</p><p>我挑了个最边上的位置站着，离这几个一肚子坏水的人远远的。</p><p>偏偏欧文今天很不对劲。没去缠着它家那个目玉の人，反倒挤来我旁边，也不说话，只是隔一会儿就转转眼球，从旁边斜我一眼。</p><p>搞不懂，我今天可没空奉陪它的馊主意。</p><p>眼看身边这家伙窸窸窣窣了半天，贤者大人总算把这一大群人都塞进了镜头里。</p><p>“三、二、一——”</p><p>前面的相机发出轻响。</p><p>白光闪过的瞬间，欧文突然贴过来，一把挽住我的手臂，夹得死紧。</p><p>这人今天到底怎么回事？找茬还是挑衅？</p><p>算了。照片都拍完了，没工夫跟它计较。该带贤者大人回去睡觉了。</p><p>转过头，准备甩手去抓人，箍在手臂上的力道却突然先一步松开。紧接着，又一道白光闪过眼前。我猛地侧过身去，可还是晚了一步。</p><p>“密斯拉呀，在魔法舍待久了，连这种程度都反应不过来了吗？以前明明不会被这种东西骗到的，被驯化的北国魔法使——哎呀，听起来好有趣。”</p><p>颧骨上传来一阵刺痛，有温热的液体淌下来。</p><p>“看吧布拉德利，我说了，这家伙的脑瓜只能单线程运转。”</p><p>欧文退开半步，笑眯眯地举起提包。</p><p>居然让欧文伤了我。好，这下不做个了断的话，今天是睡不成觉了。</p><p>我抬手抹掉碍事的血迹。</p><p>“アルシム。”</p><p>咒语落下，魔力凝成刀刃向那边刺去。周围传来几声惊呼，当然还混有老东西们装模作样的尖叫声。</p><p>对面早有准备，向后一跃。刀光擦过它的身侧，撕开一截衣角。</p><p>不过，欧文还真是没说错，一步退，步步退，从前我哪有这么多可让步的地方。一开始把贤者带回去陪我睡觉的话，我哪儿用得着费这些劲啊。</p><p>“嘿，密斯拉，这就生气了？陪贤者它们整天瞎混，连脑袋都跟着变迟钝了吗？”</p><p>“说什么呢？”</p><p>从今天见面起，欧文好像就一直在扯一些听不懂的话啊。</p><p>“啧，记性有够烂啊。”</p><p>它撇撇嘴，对我的反应相当不满意的样子，故技重施，又射出一道白色光箭。</p><p>我瞬间凝起光球，迎面撞上去，将光箭截在半空。</p><p>这人从头到尾都过于反常了，放在以前，它早该把箱子里那怪物放出来咬人的。</p><p>顷刻间，数道白光轰然对碰，无数碎片往四周飞散又炸开。</p><p>不想继续纠缠了。我召唤出魔道具，准备速战速决。</p><p>“欧文。”</p><p>它侧身避开一道炸开的白光。</p><p>“你今天到底在翻哪笔旧账？”</p><p>欧文的动作停了一瞬。</p><p>“……你不知道？”</p><p>“所以我才问你啊。”</p><p>它脸上的笑一下子消失了，猛地拉开手提箱。蛰伏其中的怪物探出三个脑袋，朝我张开满是尖牙的嘴。</p><p>总算对劲了。</p><p>我举起魔道具，对准它，骷髅眼窝中燃起幽色，冥火翻涌着，迎面撞上扑来的三头怪物。火焰和利齿剧烈相碰，掀起气浪向四周扫去。贤者它们又准备开始劝架了，可这回根本与我无关啊，我只是想睡个觉而已。刚刚还在给我们合影的相机也被掀翻了，那种东西，怎么样都好。</p><p>ケルベロス被冥焰轰翻在地，三个脑袋东倒西歪地叠在一起，彻底没了动静。我再次举起骷髅头，紫光在头顶铺展开来，一口气朝着欧文袭去。</p><p>“嘶——”</p><p>挡在它面前的魔法彻底崩碎。</p><p>我穿过尚未散尽的火焰，一把揪住它的衣领，将人重重按倒在地。骷髅空洞的眼窝重新燃起幽光，该是最后一击了。</p><p>“请您去死吧。”</p><p>“哎呀，密斯拉。”</p><p>被压在地上的人忽然笑了。</p><p>“你不看看旁边吗？”</p><p>才不会上它的当。</p><p>骷髅眼中的火焰烧得更盛了。</p><p>“真的不看吗？”欧文眯起眼睛，“明明四百年前，你对它还挺感兴趣的。”</p><p>四百年前？</p><p>啊，是那一次。</p><p>我终于明白它在扯什么了，但那又如何？请它再一次去死吧。</p><p>火光骤然落下。</p><p>就在冥焰即将吞没欧文的瞬间，另一道魔力突然从侧面撞了进来。火焰偏开半寸，擦着欧文的胸口轰进地面。它闷哼一声，整个人被余波掀了出去，重重摔在地上。</p><p>“哎呀，差一点就结束了。”</p><p>布拉德利站在不远处，慢悠悠地收回魔道具，脸上完全没有妨碍了决斗的歉意。</p><p>“先别急着杀嘛，密斯拉。它都提示到四百年前了，你至少回答一下再动手吧？”</p><p>“它说四百年前的时候，我就想起来了啊。”</p><p>欧文撑在地上的手顿了一下。</p><p>“就是你突然拿出一个黑色匣子对准我，结果话还没说完，就被我杀掉的那次吧？”</p><p>我看向它。</p><p>一阵白光而已，甚至算不上刺眼，当然不会影响我继续攻击。相机磕碜着，掉落在还没凉透的遗体身侧。唔，那天，我本来是打算直接回死之湖的，不过，我已经不记得后来为什么没能立刻动身，只是在原地蹲着，盯了半天尸体，临走前又捡起相机，对着欧文按了一下。</p><p>现在想想，还是不知道当时为什么要那么做。</p><p>“所以，你是对后来我给你拍的那张照片不满意吗？”</p><p>“你这家伙！”</p><p>它睁大眼睛，瞪着我的脸。这副表情，倒是又恢复到之前好搭话的样子了。突然有点懒得继续了。</p><p>“欧文，你还要我重新给你拍一张吗？我懒得动了啊，你需要的话，自己死一次吧。”</p><p>“嘁，谁要你拍尸体啊，真是恶趣味。”</p><p>好麻烦的人。</p><p>“那我走啦。贤者大人，回去睡觉，说好了的哦。”</p><p>旁边的布拉德利突然漏出声笑，拍拍欧文的肩，又被唰一下拍开。</p><p>“喂，我可是好心帮你。上次拍的是尸体，这次难得还活着，你真不想再来一张？”</p><p>“你闭嘴。”</p><p>本来就青白得跟死了没区别的脸色更难看了，欧文没理布拉德利，眯眼盯了我半天，泄了气似的。</p><p>“算了，跟睡不着觉的可怜鬼计较什么。”</p><p>撑起身，嗤笑一声，欧文无声无息地消失在空气中。</p><p>好吧，我歪歪脖子，虽然还是不太懂，但总算是可以回去睡觉了对吧。</p><h1 id="后记">后记</h1><p>ミスラ说如果要向我表达好意的话，请给我千年不变的爱，到那时再考虑。</p><p>博主很想要强调北兄妹在关系性上的千年不变而绝非爱情，但是写着写着有点变流水账了（）</p><p>不爱正视自己的两人，有着永远也不必要重新审视的关系，会翻旧账但是具体翻没翻过去谁也不在意。我实在太喜欢这种放任身心随水流沉浮的肆意感了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;提前谢罪把王子大人写漏了TT&lt;/p&gt;
&lt;h1 id=&quot;正文&quot;&gt;正文&lt;/h1&gt;
&lt;p&gt;贤者大人张罗着要给这届魔法使们拍张合影。&lt;/p&gt;
&lt;p&gt;最早赶来的是米契尔和央国的小家伙，叽叽喳喳地围着贤者，合照还没个影，就计划着等会儿要怎么交换相</summary>
      
    
    
    
    <category term="产出" scheme="https://crazyinloo.github.io/categories/%E4%BA%A7%E5%87%BA/"/>
    
    
  </entry>
  
  <entry>
    <title>Tears</title>
    <link href="https://crazyinloo.github.io/2026/07/31/Tears/"/>
    <id>https://crazyinloo.github.io/2026/07/31/Tears/</id>
    <published>2026-07-30T16:00:00.000Z</published>
    <updated>2026-08-12T16:33:33.412Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言">前言</h1><p>基于活动剧情《紅蓮の大地で遊ぶ愛し子》展开的往事。</p><p>小头作祟产物烦请多多包涵。</p><h1 id="正文">正文</h1><p>那个西国的哲学家这几天总不厌其烦地找我搭话，自顾自地说起它收集全魔法舍眼泪的宏大计划。据它所说，魔法使留下的泪有强化魔法科学装置的力量，这是个已经得到实验验证的结论，虽然暂时原理不明，但战备时期特殊对待，难道我不想见证奇迹的发生吗？</p><p>“奥兹给了你眼泪吗？我可不想在这上面输给它啊。”</p><p>西国魔法使总是这么烦人，我避开它的眼神，试图打发走讨厌的野猫。</p><p>奥兹当然不会把体液遗留在外，或者说，但凡是对咒术略知一二的人，都不会留下这种把柄啊，这是有多不把我当回事。</p><p>说到底，我们这样的人，根本就不会流泪吧。</p><p>我只看过切雷塔的眼泪，约定成立的那个瞬间，我看见了泪光在它眼里闪烁。定下约定的明明是我自己，为什么是它坐在草地上又哭又笑的呢？就好像又在提醒我，自己和切雷塔毕竟已经不是一样的人了。</p><p>那它的眼泪还会和我眼眶里打转的液体是同一种味道吗？</p><p>天哪，我那个时候怎么没想过要尝一下它的眼泪，再也没有解答的机会了。或者当时应该直接问切雷塔的，那滴泪明明顺着它的脸颊流到了嘴角，况且之前那次，这个霸道的人真的吃过我的泪液来着。</p><p>在红莲炎山给贤者它们讲的故事，到封印就戛然而止了，多亏 diaugur 那家伙没有透视封印之力，千百年来只记得复读切雷塔叫我名字而已。</p><p>其实我早体会过贤者口中的桑拿，切雷塔结束故事的时候，我可是就趴在火山口旁边，眼睁睁看着自己的对手被强制暂停动静。不安恼怒的精灵把岩浆舞得到处都是，火山灰遮天蔽日，本就炎热的火山口被彻底闷成蒸笼，那热气，可不是姆鲁用魔法装置能模拟出来的呢。</p><p>巨大的 diaugur 就这样消失在眼前，我侧着脸，盯着只剩嘶嘶白气的岩床，不知道该摆出什么表情。那是沙子从手中滑落的感觉，我多想站起来，却发现竟然控制不了自己的魔力——我还没悟出精灵、支配与力量的关系，也没把此地精灵的暴躁真正看进眼里。</p><p>好烦躁，好想把大家伙揪回来，好想撑起身来继续作战，明明还没有决出胜负不是吗，为什么站不起来，大腿被咬穿而已，这样的伤我早受过无数遍了啊。</p><p>我咬着牙，试图控制残破的四肢，死命瞪着火山口，想往那边爬过去。可是，一双手轻飘飘地按住了我。</p><p>那个我一直假装忽略的人，把我翻过身来，用魔法定住我。我看见它凑过来，一脸笑意，胡乱拨弄着我的脸。</p><p>“哭了吗，密斯拉，因为被夺走了猎物？”</p><p>我不想理这个人，它也不在意没有回应，自顾自地念叨着什么“果然还是小孩子”，又俯下身来。我没法再去看消失的魔兽了，切雷塔占领了我的视线，越来越近，清晰的人像逐渐变成色块的交织。金色长发散落在我身上，和伤口黏在一起，又随着它的动作把血肉磨开。好痛，好热，气息还在靠近，瞳孔一直在放大，什么都看不清了，直到有什么湿答答的东西彻底触碰到它。</p><p>它想尝我眼球的味道吗？</p><p>炙热的软体挑衅着眼白，眼皮被手拉开，就这样直瞪瞪地被侵犯，一下，又一下。分泌的泪液下一瞬间就被刮去，好像一切液体都被眼前的炽热蒸发干净。</p><p>眼球又麻又干，只是每每在被触碰的瞬间微微跳动。</p><p>好想眨眼。为什么我耳边只余眼球起跳的声音。</p><p>“这下真的哭了呀，密斯拉。”</p><p>突然传来杂糅着惊讶的调笑，它在说什么，不对，它怎么在说话？我试着眨动眼皮，一滴泪从另一只被冷落的眼眶滑出。再眨，试着聚焦视线，用手撑起身躯，我瞪着这个讨厌的人。</p><p>“总算冷静下来了，你看，现在可以控制四肢了呢。”</p><p>完全没有被我的眼神吓到！</p><p>“切雷塔，我会回来找我的猎物的。”</p><p>脸上早已糊成一片，我用力抹了抹，却赶不走那种黏腻感，血迹也好，涎液也罢，早就在热气的蒸腾下凝固了，或许还混合着那滴泪。它看着我脏兮兮的样子，笑着应了声，挽住我的手带着我往死之湖飞去。</p><p>哈，切雷塔这副不称职的老师模样，现在只有我知道了。眼泪的味道，再也不会有人为我解答了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;基于活动剧情《紅蓮の大地で遊ぶ愛し子》展开的往事。&lt;/p&gt;
&lt;p&gt;小头作祟产物烦请多多包涵。&lt;/p&gt;
&lt;h1 id=&quot;正文&quot;&gt;正文&lt;/h1&gt;
&lt;p&gt;那个西国的哲学家这几天总不厌其烦地找我搭话，自顾自地说起它收集全魔法舍眼泪的宏大计划。</summary>
      
    
    
    
    <category term="产出" scheme="https://crazyinloo.github.io/categories/%E4%BA%A7%E5%87%BA/"/>
    
    
  </entry>
  
  <entry>
    <title>I&#39;m Only Sleeping</title>
    <link href="https://crazyinloo.github.io/2026/07/07/I&#39;m%20Only%20Sleeping/"/>
    <id>https://crazyinloo.github.io/2026/07/07/I&#39;m%20Only%20Sleeping/</id>
    <published>2026-07-06T16:00:00.000Z</published>
    <updated>2026-08-12T16:34:13.115Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言">前言</h1><p>密密的最终幻想（</p><h1 id="正文">正文</h1><p>有多久没睡过完整的一觉了。</p><p>白日没有运送尸体的活找上门，无聊地度过一天光阴，在困倦中逐渐失去意识，一夜无梦，第二日懒洋洋地被太阳照醒；或是历经一番大战，修复好受损的血肉，就地躺下任凭自己昏迷，醒来再回船上待业。</p><p>我好想再完整地睡一觉。</p><p>上好的熊皮一定要准备一张，我要裹着它睡在雪被里。剩下的肉就在一旁的篝火上烧着吧，噢，讲起这个，烤肉酱好像用完了啊，我得抽个空去森林里再煮一锅，这次双子应该没那么多废话了吧。诶，好像忘了什么，之前不是说要和布拉德利一起去搜刮双子的房间来着，后来怎么没去呢？好烦，现在奥兹晚上恢复魔力了，就算趁天黑出击，大概也会被拦下来。那对双子总是搬救兵，丧失了半身力量的下场就是这样吗，真可怜。还是直接去闯魔王的城堡吧，也该到了一决胜负的时候了，我会证明自己才是夜之帝王的。日子就该这么过才对啊，马上就想传送过去打上一架。</p><p>“クーレ・メミニ。”</p><p>什么动静。</p><p>我睁开眼，侧身躲开，但还是被蹭掉一大块皮。</p><p>“アルシム。”</p><p>欧文，它怎么在这里？</p><p>“密斯拉，闯进梦之森，不需要先向主人打声招呼吗？”</p><p>啊，我在梦之森，大灾厄还没结束，觉也根本没睡成。做了个可笑的白日梦，现在还被吵醒了，真烦人。</p><p>“你是蠢货吗，呵呵……听不懂话也没关系，来了梦之森，总要留下点什么来滋养它吧，睡不着觉的你连梦境都没法提供，我就替可怜的它主持一下公道吧。”</p><p>好想睡觉。</p><p>总之，先解决眼前的挑衅吧，说不定，这次打累了可以睡个好觉呢。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;密密的最终幻想（&lt;/p&gt;
&lt;h1 id=&quot;正文&quot;&gt;正文&lt;/h1&gt;
&lt;p&gt;有多久没睡过完整的一觉了。&lt;/p&gt;
&lt;p&gt;白日没有运送尸体的活找上门，无聊地度过一天光阴，在困倦中逐渐失去意识，一夜无梦，第二日懒洋洋地被太阳照醒；或是历经一番大</summary>
      
    
    
    
    <category term="产出" scheme="https://crazyinloo.github.io/categories/%E4%BA%A7%E5%87%BA/"/>
    
    
  </entry>
  
  <entry>
    <title>Both Sides, Now</title>
    <link href="https://crazyinloo.github.io/2026/07/04/Both%20Sides,%20Now/"/>
    <id>https://crazyinloo.github.io/2026/07/04/Both%20Sides,%20Now/</id>
    <published>2026-07-03T16:00:00.000Z</published>
    <updated>2026-08-12T16:23:04.414Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言">前言</h1><p>本文灵感来源于Joni Mitchell的同名歌曲。</p><h1 id="正文">正文</h1><p>又飘过一朵云。</p><p>这次是羽毛覆盖的峡谷，还是北国巨兽的翅膀？</p><p>我不知道，我只是躺在船上，看着云团聚拢又消散。</p><p>听起来文艺又无聊吗？唔，其实我也不知道自己是在看什么，或是在等待什么的出现。只是，风雪过境的日子太多，这样能够捕捉到云朵轨迹的时刻，我好像不想错过。</p><p>魔法使的生命太漫长，再稀少的瞬间，叠加起来也算不上稀奇。可我还是不明白，所以仍会一次次等待它出现又离去，连打斗也可以暂且放在一边。</p><p>从前我一直是这样看云的。切雷塔来之前是这样，走之后也是这样。</p><p>我以为我们可以一直这样看着云。我还是躺在那条船上，头枕着手，微眯着眼，望着难得的晴天。身边或许会有魔女突然降落，这样的时刻，即使是聒噪的它也会愿意只是坐在船侧，静静地感受身旁的吐息；或许直到云消散也不会有人来，但那又如何。魔法使的时间看不到尽头，云朵总会在下一次出现，行踪不定的那个人，也总会在某天又带来吵闹的笑声。</p><p>可我还是不懂云，尽管我已经看遍了它，从各个角度。有那么多事，我本来可以去做，却被云挡住了去路。我想去追问它的变幻莫测，不知不觉间，反倒一路跟着它来到了南国。死之湖的云厚重浓烈，飘到这里，却变得缥缈柔软。我不明白，明明一直在看着它，我还是不懂它为什么要变化。</p><p>船只在第谷湖上晃晃悠悠，我躺在上面，想找回熟悉的感觉，却浑身不得劲。这里的云可以从日出逗留到日落，可以被骤雨打散又在晴时恢复如初，一点都不像我地盘上的那家伙。可真懒散啊，我才不要奉陪，你就慢慢悠悠地留在这儿散步吧。猛地坐起来，没有知会任何人，我悄悄地回去了。</p><p>我好像有一点懂它了，在我不再能等到它之后。那些家伙都说它变了，我也依旧这样觉得，可或许，我曾坚信的那些也只是一场幻象呢，厚重却一吹即灭，无形却阴魂不散，这听起来，不是最荒谬的错觉吗？这家伙，真是给我留下了个大麻烦呢。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言&quot;&gt;前言&lt;/h1&gt;
&lt;p&gt;本文灵感来源于Joni Mitchell的同名歌曲。&lt;/p&gt;
&lt;h1 id=&quot;正文&quot;&gt;正文&lt;/h1&gt;
&lt;p&gt;又飘过一朵云。&lt;/p&gt;
&lt;p&gt;这次是羽毛覆盖的峡谷，还是北国巨兽的翅膀？&lt;/p&gt;
&lt;p&gt;我不知道，我只是躺在船上，看着云团聚拢</summary>
      
    
    
    
    <category term="产出" scheme="https://crazyinloo.github.io/categories/%E4%BA%A7%E5%87%BA/"/>
    
    
  </entry>
  
  <entry>
    <title>linux操作</title>
    <link href="https://crazyinloo.github.io/2026/03/01/linux%E6%93%8D%E4%BD%9C/"/>
    <id>https://crazyinloo.github.io/2026/03/01/linux%E6%93%8D%E4%BD%9C/</id>
    <published>2026-02-28T16:00:00.000Z</published>
    <updated>2026-08-12T17:03:31.038Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Linux">Linux</h1><h2 id="What-is-Linux？">What is Linux？</h2><ul><li>一个Linux发行版（例如Ubuntu）：<ul><li>Linux内核</li><li>GNU项目：一个自由软件集合</li><li>其它软件和库</li></ul></li></ul><h2 id="Linux基础操作">Linux基础操作</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">命令名 [选项][参数]...</span><br></pre></td></tr></table></figure><ul><li>[ ]:意为可选0~n个</li><li>可通过<code>man</code>命令来查看具体命令的使用说明  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">man [选项] 命令</span><br></pre></td></tr></table></figure></li></ul><h3 id="目录操作">目录操作</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd directory</span><br></pre></td></tr></table></figure><p>在需要键入文件名或目录名时:可以使用 <code>Tab</code> 自动补足全名，<code>双击 Tab</code> 可以显示所有可能选项</p><ul><li><code>/</code>:根目录</li><li><code>~</code>:当前用户主目录<ul><li>普通用户($):<code>/home/username</code></li><li>root(系统管理员)用户(#):<code>/root</code></li></ul></li><li><code>.</code>:当前目录</li><li><code>..</code>:上一级目录</li><li><code>-</code>:上一次访问的目录</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls [选项] [目录]</span><br></pre></td></tr></table></figure><ul><li>选项（常用）：<ul><li><code>-a</code>              显示隐藏的文件</li><li><code>-l</code>              每行只列出一个文件</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir [选项] 目录</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pwd [选项]</span><br></pre></td></tr></table></figure><ul><li>作用：输出当前目录的绝对路径</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rmdir [选项] 目录</span><br></pre></td></tr></table></figure><ul><li>作用：删除<strong>空</strong>目录</li></ul><h3 id="文件操作">文件操作</h3><p>支持对多个文件的操作，例如使用<code>*</code>来匹配任意长度的字符串</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch [选项] 文件名</span><br></pre></td></tr></table></figure><ul><li>作用：当文件存在时更新文件的时间戳，当文件不存在时创建新文件。</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm [选项] 文件</span><br></pre></td></tr></table></figure><ul><li>选项：<ul><li><code>-r</code>:递归删除目录及其内容，删除非空目录必须有此选项，否则无法删除</li><li><code>-f</code>:强制删除，不提示用户确认，忽略不存在的目录</li><li><code>-i</code>:逐一提示用户确认每个将要被删除的文件</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp [选项] 源文件 目标路径</span><br></pre></td></tr></table></figure><ul><li>选项：<ul><li><code>-r</code>:递归复制目录及其子目录内的所有内容</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mv [选项] 源文件 目标路径</span><br></pre></td></tr></table></figure><ul><li>作用：<ul><li>move</li><li><mark>rename</mark>：例如<code>mv test.txt test2.txt</code></li></ul></li><li>选项：<ul><li><code>-v</code>:显示详细的操作信息</li><li><code>-i</code>:覆盖前询问</li><li><code>-u</code>:(仅在有必要时移动)仅在源文件较新，或目标文件不存在时，才执行移动操作</li></ul></li><li>多源移动；当有多个源时，最后一个参数必须是目录</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">diff [选项] 文件1 文件2</span><br></pre></td></tr></table></figure><ul><li>作用：比较</li><li>选项：<ul><li><code>-b</code>:不检查空白字符的不同</li><li><code>-B</code>:不检查空行</li><li><code>-1</code>:仅显示有无差异，不显示详细信息</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat 文件</span><br></pre></td></tr></table></figure><ul><li>作用：将文件内容输出到标准输出</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo &lt;text&gt;</span><br></pre></td></tr></table></figure><ul><li>作用：print</li><li>默认添加换行符，所以即使echo ''并非空（需要 -n去除）</li></ul><h3 id="查找操作">查找操作</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find [路径] &lt;选项&gt;</span><br></pre></td></tr></table></figure><ul><li>作用：在给定路径/当前目录下查找</li><li>选项：<ul><li><code>-name &lt;文件名&gt;</code>:指定需要查找的文件名</li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep [选项] PATTERN FILE</span><br></pre></td></tr></table></figure><p>（PATTERN是匹配字符串，FILE是文件或目录的路径）</p><ul><li>作用：输出匹配PATTERN的文件和相关的行。</li><li>选项：<ul><li><code>-a</code>:不忽略二进制数据进行搜索。</li><li><code>-i</code>:忽略大小写差异。</li><li><code>-r</code>:从目录中递归查找。</li><li><code>-n</code>:显示行号。</li><li><code>-v</code>:反向过滤</li><li><code>-w</code>:按独立单词匹配</li><li><code>-o</code>:只输出匹配到的部分</li></ul></li><li>例如：<code>grep hello a.txt</code></li><li>可使用正则表达式作匹配<ul><li><code>'^a'</code>：匹配行首为a的行</li><li><code>'end$'</code>：匹配行尾为end的行</li><li><code>'[0-9]'</code></li></ul></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tree [选项] [目录名]</span><br></pre></td></tr></table></figure><ul><li>作用：输出一个目录下的文件树。</li><li>选项：<ul><li><code>-a</code>:列出全部文件（包含隐藏文件）</li><li><code>-d</code>:只列出目录</li></ul></li></ul><h3 id="快捷键">快捷键</h3><ul><li><code>ctrl + c</code>：终止程序执行</li><li><code>ctrl + z</code>：挂起当前程序</li><li><code>ctrl + d</code>：终止输入（相当于输入一个EOF）</li><li><code>ctrl + l</code>：清屏</li><li><code>ctrl + s</code>/<code>ctrl + q</code>：暂停/启动终端</li></ul><h2 id="GNU工具">GNU工具</h2><h3 id="GCC">GCC</h3><p>即GNU编译器套件。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc [选项] 源代码文件</span><br></pre></td></tr></table></figure><ul><li>作用：编译源代码文件</li><li>选项:<code>-o example</code></li><li>若编译成功，同目录下出现<code>a.out</code>可执行文件<ul><li>执行<code>./a.out</code>即可输出</li><li>需要传参？可类比：<code>./casegen.out add 100 &gt; case_add</code></li></ul></li></ul><h3 id="make">make</h3><p><a href="https://www.ruanyifeng.com/blog/2015/02/make.html">make学习博客</a></p><ul><li>make工具：根据Makefile中规则，<strong>自动化</strong>编译和构建项目</li><li><code>Makeflie</code><ul><li>由一系列rules构成，每条rule形式如下：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;target&gt; : &lt;prerequisites&gt; </span><br><span class="line">[tab]  &lt;commands&gt;</span><br></pre></td></tr></table></figure></li><li>target<ul><li>通常是文件名：指明Make命令所要构建的对象</li><li>也可以是某个操作的名字，这称为phony ，例如：  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">.PHONY: clean</span><br><span class="line">clean:</span><br><span class="line">rm *.o temp</span><br></pre></td></tr></table></figure></li><li>若Make命令没有指定目标，默认会执行Makefile文件的第一个目标</li></ul></li><li>prerequisites(前置条件)<ul><li>通常是一组文件名，之间用<mark>空格</mark>分隔</li><li>用法：生成多个文件<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/1.png" alt="alt text"></li><li>本质：若某个文件变化，会导致目标过期，则当前目标依赖该文件<ul><li>注意区分与伪目标（调用就执行，不关心过期）</li></ul></li></ul></li><li>commands(命令)<ul><li>注意：需要注意的是，每行命令在一个<strong>单独的shell</strong>中执行。这些Shell之间<strong>没有继承关系</strong>。<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/2.png" alt="alt text"><ul><li>这种“独立”只反映在shell变量上，而不影响磁盘上文件的改变</li></ul></li></ul></li><li>多级Makefile：<ul><li>调用下级Makefile：<ul><li><code>make -C subfile xxx</code></li></ul></li></ul></li><li>Grammar<ol><li><code>#</code></li><li>echoing回声</li></ol><ul><li>正常情况下，make会打印每条命令，然后再执行，这就叫做回声</li><li>在命令的前面加上<code>@</code>，就可以关闭回声</li></ul><ol start="3"><li>wildcard通配符<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/3.png" alt="alt text"></li><li>模式匹配：<code>%</code></li><li>变量和赋值符<ol><li>调用时，要把变量放在<code>$()</code>中</li><li>赋值运算符:常用<code>:=</code><img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/4.png" alt="alt text"></li></ol></li><li>内置变量</li></ol><ul><li><code>$(CC)</code>:指向当前使用的编译器</li></ul><ol start="7"><li>自动变量<ol><li><code>$@</code>:代指当前target</li><li><code>$&lt;</code>:代指第一个前置条件</li><li><code>$？</code>:代指比目标更新的所有前置条件</li><li><code>$^</code>:代指所有前置条件，之间以空格分隔</li><li><code>$*</code>:指代匹配符<code>%</code>匹配的部分</li></ol></li><li>循环和判断：遵循bash语法</li></ol></li></ul></li></ul><h3 id="ctags">ctags</h3><p>在<code>~/.vimrc</code>中添加配置:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">set tags=tags</span><br><span class="line">set autochdir</span><br></pre></td></tr></table></figure><ul><li>功能：代码跳转<ul><li><code>ctrl+]</code>跳转至相关定义文件位置</li><li><code>ctrl+o</code>返回跳转前位置</li></ul></li></ul><h3 id="tmux">tmux</h3><p>终端复用工具输入<code>tmux</code>进入tmux新对话</p><ul><li>重要快捷键：<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/5.png" alt="alt text"></li></ul><h1 id="Git">Git</h1><p><img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/6.png" alt="alt text"></p><ul><li>工作区</li><li>暂存区</li><li>版本库<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/7.png" alt="S"></li><li>untracked：未跟踪，未被git跟踪的状态</li><li>unmodified：未修改，版本库版本和工作区版本一致</li><li>modified：已修改，版本库版本和工作区版本不一致</li><li>staged：已暂存，修改版本已提交至暂存区，但尚未上传</li></ul><h2 id="Git常用指令">Git常用指令</h2><h3 id="基本提交">基本提交</h3><p><code>git init</code><code>git clone &lt;URL&gt;</code>:“克隆”一个已有的储存库到当前目录下<code>git status</code>:查看当前分支状态<code>git add</code>：将新文件/已修改文件加入暂存区</p><ul><li><code>git add .</code>:add所有修改进入暂存区</li><li><code>git add &lt;filename&gt;</code></li></ul><p><code>git checkout</code>:切换分支（需要保证当前所有文件状态为<code>未修改</code>）<code>git commit</code>:<code>git commit -m &lt;message&gt;</code></p><ul><li>将暂存区的修改提交到储存库中</li></ul><p><code>git log</code>:查询提交记录</p><h3 id="撤销指令">撤销指令</h3><ul><li>工作区撤销<code>git restore &lt;file&gt;</code>把工作区文件恢复到暂存区版本</li><li>暂存区撤销<code>git restore --staged &lt;file&gt;</code>把文件从暂存区取出，但还保留工作区文件</li><li>删除未跟踪文件<code>git clean -f</code></li></ul><h3 id="版本回退">版本回退</h3><ul><li>版本库回到上一个提交<code>git reset --hard HEAD^</code></li><li>版本库回到指定提交<code>git reset --hard &lt;hash&gt;</code><ul><li>hash: 对应提交的hash值，可用git log获取</li></ul></li></ul><h3 id="远程本地同步">远程本地同步</h3><ul><li>远程-&gt;本地：<code>git pull [远程仓库名] [远程仓库分支]:[本地仓库分支]</code></li><li>本地-&gt;远程：<code>git push [远程仓库名] [本地仓库分支]:[远程仓库分支]</code><code>git restore</code>：取消修改</li><li>未add入暂存区时：<code>git restore &lt;filename&gt;</code> 来撤销对这个文件的修改，使其退回到上一个 commit 的状态</li><li>已add入暂存区后：<code>git restore --staged &lt;filename&gt;</code>将文件移除暂存区，<strong>再次restore</strong></li></ul><h1 id="Shell">Shell</h1><p>Shell，即操作系统的“外壳”（相对“内核”而言），是用于访问操作系统服务的用户界面</p><h2 id="分类">分类</h2><h3 id="GUI-Shell">GUI Shell</h3><ul><li>GUI：<ul><li>Graphical User Interface</li></ul></li></ul><h3 id="CLI-Shell">CLI Shell</h3><ul><li>CLI：<ul><li>Command Line Interface：命令行界面</li></ul></li></ul><h2 id="Shell脚本语言">Shell脚本语言</h2><h3 id="Shell脚本的执行">Shell脚本的执行</h3><ul><li>约定脚本文件的文件名以<code>.sh</code>结尾</li><li>执行Shell脚本：<code>./文件名</code><ul><li>前提：脚本文件有“执行”权限</li><li>用<code>chmod +x filename</code>添加执行权限</li></ul></li></ul><h3 id="Bash-Shell语法基础">Bash Shell语法基础</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#My first Shell script!</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;Hello, world!&quot;</span></span><br></pre></td></tr></table></figure><p><img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/8.png" alt="alt text"></p><ol><li>变量：无需指定类型，但是等号两边<mark>不允许空格</mark></li></ol><ul><li>使用<code>${var_name}</code>/<code>$var_name</code>可以获取变量的值</li><li>数组：<code>i=(1 2 3 4)</code></li></ul><ol start="2"><li>脚本参数<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/9.png" alt="alt text">特殊变量：<ul><li><code>$#</code>:传递的参数个数</li><li><code>$*</code>:一个字符串，内容是传递的全部参数</li><li><code>$?</code>:函数返回值</li><li><code>$N</code>:当<code>N&gt;=10</code>时，需使用<code>${N}</code>使用特殊变量时，尽量加上双引号<code>&quot;&quot;</code>，防止解析错误</li></ul></li><li>条件: <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> condition1</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">    command11</span><br><span class="line">    command12</span><br><span class="line">    ......</span><br><span class="line"><span class="keyword">elif</span> condition2</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">    command21</span><br><span class="line">    command22</span><br><span class="line">    ......</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">    command31</span><br><span class="line">    command32</span><br><span class="line">    ......</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure></li></ol><ul><li>整数比较方法：<code>((condition))</code></li></ul><ol start="4"><li>循环</li></ol>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> condition</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line"> <span class="built_in">command</span></span><br><span class="line"> ...</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><ol><li>计算<ul><li>以下等价：<ul><li><code>let i=i+1</code></li><li><code>i=$((i+1))</code></li></ul></li><li>运算符：<ul><li><code>(())</code>:结果非零时返回0（真）</li><li><code>$(())</code>：直接返回计算数值结果</li><li><code>[]</code>:条件为真时返回0<ul><li>[ -s &lt; file&gt; ]：文件非空</li></ul></li><li><code>[[]]</code>:支持<code>&amp;&amp;</code>等逻辑符</li></ul></li></ul></li><li>函数</li></ol><ul><li>定义：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">fun_name</span></span>() &#123;</span><br><span class="line">  body...</span><br><span class="line">  <span class="built_in">return</span> int_value;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>(如果要返回值，必须返回一个[0,255]之间的整数)</li><li>调用：<code>fun_name param1 param2 ... paramN</code></li></ul><ol start="3"><li>变量字符串分割<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$&#123;name:1:3&#125; //$&#123;变量:起始位置:长度&#125;</span><br><span class="line">$&#123;name:0:(-3) &#125;//去掉末尾3个字符</span><br></pre></td></tr></table></figure></li></ol><h2 id="sed">sed</h2><p>通过命令编辑和输出文本的工具</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sed [选项] &#x27;命令&#x27; 文件</span><br></pre></td></tr></table></figure><ul><li>选项<ul><li><code>-n</code>：安静模式，只显示经过sed处理的内容。否则显示输入文本的所有内容。</li><li><code>-i</code>：直接修改读取的档案内容，而不是输出到屏幕。<strong>否则，只输出不编辑</strong>。</li><li><code>-e</code>: 允许在同一行里执行多条命令,例如<code>sed -e '4astr ' -e 's/str/aaa/' my.txt</code></li></ul></li><li>命令：<ul><li>&lt;行号&gt;a&lt;内容&gt;： 新增，在行号后新增一行相应内容。行号可以是“数字”，在这一行之后新增，也可以是“起始行，终止行”，在其中的每一行后新增。当不写行号时，在每一行之后新增。使用$表示最后一行。后面的命令同理。</li><li>&lt;行号&gt;c&lt;内容&gt;：取代。用内容取代相应行的文本。</li><li>&lt;行号&gt;i&lt;内容&gt;：插入。在当前行的上面插入一行文本。</li><li>&lt;行号&gt;d：删除当前行的内容。</li><li>&lt;行号&gt;p：输出选择的内容。通常与选项-n一起使用。<ul><li>‘n,mp’:输出<code>[n,m]</code>行</li></ul></li><li>s/<re>/<string>：将<re>（正则表达式）匹配的内容替换为<string><ul><li>默认只作用于每一行的第一个匹配项</li><li>末尾标识符<code>g</code>：作用于所有，e.g.<code>sed -i &quot;s/char/int/g&quot; file</code></li></ul></li></ul></li></ul><h2 id="awk">awk</h2><p>文本处理工具<code>awk '条件 { 动作 }' 文件名</code></p><ul><li><p>awk默认：</p><ul><li>一次读取1行</li><li>把这一行拆成若干字段，用空白字符分割每一列</li><li>执行规则</li></ul></li><li><p>常用内置变量</p><ul><li><code>$0</code>:整行</li><li><code>$n</code>:第n列</li><li><code>NF</code>:当前行的字段数</li><li><code>NR</code>:当前是第几行</li><li><code>OFS</code>:输出字符分隔符</li></ul></li><li><p>例如：</p><ul><li><code>awk '$2 &gt; 80 {print $0}' score.txt</code>：当第二列大于80时，输出一整行</li><li><code>awk -F ',' '{print $1, $3}' test.csv</code>：输入分隔符为<code>,</code></li></ul></li><li><p>一定要注意用<code>''</code>包裹条件&amp;动作，防止解析错误</p></li></ul><h2 id="重定向">重定向</h2><p>在命令后添加</p><ul><li><code>&gt; output.txt</code>：覆盖原有内容，若不存在则新建</li><li><code>&gt;&gt; output.txt</code>：追加内容即可将输出重定向到文件中，而非原本的控制台上</li><li><code>&lt;</code>:输入重定向</li><li>标准流：<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/10.png" alt="alt text"><ul><li><code>&gt;</code> 是 <code>1&gt;</code> 的简写tips:</li><li>重定向<strong>不能创建目录</strong>，只能创建文件</li></ul></li></ul><h2 id="管道">管道</h2><p>管道符号<code>|</code>可以对命令进行连接<img src="/images/OS/Linux%E6%93%8D%E4%BD%9C/11.png" alt="alt text">e.g.+</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -n <span class="string">&quot;key&quot;</span> file1.txt | <span class="built_in">cut</span> -d <span class="string">&quot;:&quot;</span> -f 1</span><br></pre></td></tr></table></figure><ul><li>cut：<ul><li><code>-d &quot;:&quot;</code>:以&quot;:&quot;作为分隔符</li><li><code>-f n</code>:取第n块<ul><li><code>-f n、m</code></li><li><code>-f n-m</code></li></ul></li></ul></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Linux&quot;&gt;Linux&lt;/h1&gt;
&lt;h2 id=&quot;What-is-Linux？&quot;&gt;What is Linux？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一个Linux发行版（例如Ubuntu）：
&lt;ul&gt;
&lt;li&gt;Linux内核&lt;/li&gt;
&lt;li&gt;GNU项目：一个自由软件集</summary>
      
    
    
    
    <category term="OS" scheme="https://crazyinloo.github.io/categories/OS/"/>
    
    
  </entry>
  
  <entry>
    <title>vim</title>
    <link href="https://crazyinloo.github.io/2026/03/01/vim/"/>
    <id>https://crazyinloo.github.io/2026/03/01/vim/</id>
    <published>2026-02-28T16:00:00.000Z</published>
    <updated>2026-08-12T17:05:11.377Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://coolshell.cn/articles/5426.html">vim学习</a></p><h1 id="Vim">Vim</h1><p>Linux系统下的开源文本编辑器</p><ul><li>基本输入操作<ul><li>创建文件（touch）</li><li>打开文件<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim helloworld.c</span><br></pre></td></tr></table></figure></li><li>输入内容：按<code>I</code>进入输入模式</li><li>保存并退出vim<ol><li>按<code>esc</code>回到命令模式</li><li>按<code>shift+;</code>进入底线命令模式</li><li>输入<code>w</code>并<code>enter</code>，保存文件</li><li>再进入底线命令模式，输入<code>q</code>即可关闭文件回到CLI shell（3、4可合并为<code>wq</code>）</li></ol></li></ul></li></ul><h2 id="配置">配置</h2><ul><li>配置文件：<code>.vimrc</code>,位于用户主目录下</li><li><a href="https://www.ruanyifeng.com/blog/2018/09/vimrc.html">.vimrc配置</a></li></ul><h2 id="Normal模式">Normal模式</h2><h3 id="复制粘贴">复制粘贴</h3><p>如何复制选中内容到系统剪切板？</p><ul><li><a href="https://zxkjack123.github.io/ubuntu/vim-copy-to-clipboard/">https://zxkjack123.github.io/ubuntu/vim-copy-to-clipboard/</a></li><li>粗暴：先cat file，直接打印到shell，再复制</li></ul><h3 id="Undo-Redo">Undo/Redo</h3><ul><li><code>u</code>:undo</li><li><code>&lt;C-r&gt;</code>:redo</li></ul><h3 id="delete">delete</h3><ul><li><code>x</code>:删当前光标所在的一个字符</li><li><code>dd</code>:删除当前行，并把删除的行存到剪贴板里</li></ul><h3 id="移动光标">移动光标</h3><ul><li><code>0</code>:到行头</li><li><code>^</code>:到行首第一个非空字符</li><li><code>:&lt;n&gt;</code>:移动到第n行</li><li><code>gg</code>：移动到第一行</li><li><code>&lt;C-f&gt;</code>/<code>&lt;C-b&gt;</code>：前后翻整页</li></ul><h2 id="可视模式">可视模式</h2><p>输入<code>v</code>进入</p><h3 id="复制粘贴-2">复制粘贴</h3><p>以下仅限于vim内部操作</p><ul><li><code>d</code>:剪切选中的文本段</li><li><code>y</code>:复制</li><li><code>p</code>:粘贴</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://coolshell.cn/articles/5426.html&quot;&gt;vim学习&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;Vim&quot;&gt;Vim&lt;/h1&gt;
&lt;p&gt;Linux系统下的开源文本编辑器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本输入操作
&lt;ul&gt;
&lt;li&gt;创建</summary>
      
    
    
    
    <category term="OS" scheme="https://crazyinloo.github.io/categories/OS/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-CO-P7 MIPS微系统</title>
    <link href="https://crazyinloo.github.io/2025/12/15/CO-P7/"/>
    <id>https://crazyinloo.github.io/2025/12/15/CO-P7/</id>
    <published>2025-12-15T14:24:00.000Z</published>
    <updated>2025-12-15T14:25:25.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/CO/P7/image.png" alt="通关纪念！"></p><h1 id="目标简述">目标简述</h1><p>在P6的基础上，实现一个简单的计算机系统（MIPS微系统）。</p><h2 id="三种外设">三种外设</h2><ul><li>Timer（计时器）：计时部件，可以按照配置定时产生<code>时钟中断</code></li><li>Memory（存储器）：外置IM、DM（类似P6）</li><li>InterruptGenerator（中断发生器）：随机产生外部中断信号，产生的中断信号在CPU响应前会持续<strong>置高</strong></li></ul><h2 id="支持异常处理的CPU">支持异常处理的CPU</h2><ol><li><p>异常</p><ol><li>内部异常：<ul><li>由于<strong>指令执行错误</strong>导致的“事件”</li><li>例如：加法溢出，除法除零</li></ul></li><li>外部中断<ul><li>由于<strong>外部设备信号</strong>导致的“事件”</li><li>例如：计时器信号</li></ul></li></ol></li><li><p>内部异常检测</p></li><li><p>外部中断检测</p></li><li><p>CP0：接收异常，储存异常类型，实现精确异常</p></li><li><p>异常处理</p></li></ol><h2 id="软硬件接口">软硬件接口</h2><ol><li>外设的接口设计——<mark>系统桥</mark><ul><li><p>连接CPU和外设的功能设备</p><ul><li>CPU — SystemBridge — { DM , Timer , InterruptGen , … }</li></ul></li><li><p>给CPU提供一种接口，使得CPU可以按地址读写复杂多变的外设</p><ul><li>CPU不再关心外设长什么样，它只会按地址读写（用统一的方法访问外设）</li><li>所有外设都是“DM”</li></ul></li></ul></li><li>CPU的接口设计<ul><li>封装成单周期CPU</li></ul></li></ol><h2 id="宏观PC">宏观PC</h2><ul><li>把复杂的多级流水线CPU封装成单周期CPU</li><li>宏观PC：整个 CPU “宏观”运行指令所对应的PC地址。我把<code>CP0</code>放在了M级，所以把<code>M_PC</code>作为宏观PC。<ul><li>该指令之前的所有指令序列对 CPU 的更新已完成</li><li>该指令及其之后的指令序列对 CPU 的更新未完成</li></ul></li></ul><h1 id="顶层设计">顶层设计</h1><p><img src="/images/CO/P7/image-159.png" alt="整体层次"><img src="/images/CO/P7/image-158.png" alt="顶层数据通路示意图"></p><h1 id="任务清单">任务清单</h1><p><img src="/images/CO/P7/image-156.png" alt="最终架构图">设计思路：从<code>CP0</code>开始，一步步推进。</p><h2 id="协处理器CP0">协处理器CP0</h2><ul><li><p>功能接收内部异常和外部中断，产生异常控制</p></li><li><p>设计本质上是一组特殊寄存器。</p><table><thead><tr><th>寄存器</th><th>编号</th><th>功能</th></tr></thead><tbody><tr><td>SR（State Register）</td><td>12</td><td>配置异常的功能，即：<br>当前CPU：<br>1.能不能处理外部中断（IE）<br>2.能处理哪些外部中断（IM）<br>3.是否正在处理异常(EXL)</td></tr><tr><td>Cause</td><td>13</td><td>记录异常发生的原因和情况<br>- 外部中断源：IP<br>- 内部异常类型：ExcCode）</td></tr><tr><td>EPC</td><td>14</td><td>记录异常处理结束后需要返回的PC</td></tr></tbody></table><table><thead><tr><th>寄存器</th><th>功能域</th><th>位域</th><th>解释</th></tr></thead><tbody><tr><td>SR（State Register）</td><td>IM（Interrupt Mask）</td><td>15:10</td><td>分别对应六个<strong>外部中断</strong>源，相应位置 1 表示允许中断，置 0 表示禁止中断。<br><mark>控制能处理哪些外部中断</mark></td></tr><tr><td>SR（State Register）</td><td>EXL（Exception Level）</td><td>1</td><td>只要进入异常（I&amp;E）就置1，处理完异常、执行<code>eret</code>时置0</td></tr><tr><td>SR（State Register）</td><td>IE（Interrupt Enable）</td><td>0</td><td>全局中断使能，该位置 1 表示允许外部中断</td></tr><tr><td>Cause</td><td>BD（Branch Delay）</td><td>31</td><td>异常是否发生在分支延迟槽中<br>tip:只有内部异常才可能导致BD为1</td></tr><tr><td>Cause</td><td>IP（Interrupt Pending）</td><td>15:10</td><td>为 6 位待决的中断位，分别对应 6 个<strong>外部中断</strong>，相应位置 1 表示有中断，置 0 表示无中断<br><mark>反映外部中断源</mark></td></tr><tr><td>Cause</td><td>ExcCode</td><td>6:2</td><td>内部异常编码，记录当前发生的是什么内部异常。</td></tr></tbody></table></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>复位信号</td></tr><tr><td>CP0WE</td><td>I</td><td>1</td><td>CP0 写使能信号</td></tr><tr><td>CP0Address</td><td>I</td><td>5</td><td><strong>要访问哪个CP0寄存器</strong>（SR/Cause/EPC）</td></tr><tr><td>CP0WD</td><td>I</td><td>32</td><td>写入 CP0 的数据</td></tr><tr><td>VPC</td><td>I</td><td>32</td><td>受害 PC（发生异常时的 PC）</td></tr><tr><td>BDIn</td><td>I</td><td>1</td><td>是否处于延迟槽</td></tr><tr><td>ExcCodeIn</td><td>I</td><td>5</td><td>内部异常类型编码</td></tr><tr><td>HWInt</td><td>I</td><td>6</td><td><strong>外部</strong>硬件中断信号，对应Cause_IP/SR_IM</td></tr><tr><td>EXLclr</td><td>I</td><td>1</td><td>清除 EXL，用于执行 <code>eret</code></td></tr><tr><td>CP0RD</td><td>O</td><td>32</td><td>从 CP0 读出的数据</td></tr><tr><td>EPC</td><td>O</td><td>32</td><td>EPC 寄存器输出值</td></tr><tr><td>Req</td><td>O</td><td>1</td><td>是否进入异常处理程序<br>1: PC ← 异常入口地址</td></tr></tbody></table></li></ul><p><mark>tips</mark>：</p><ol><li><p><code>CP0Address</code>、<code>CP0WE</code> 是针对 CPU 执行<code> mfc0 / mtc0</code> 指令时访问 CP0 寄存器用的，而<code>异常更新</code>并不会经过CP0Address。这两条路径几乎完全分离；</p></li><li><p>Req生成逻辑</p><ul><li>Req = 外部中断|内部异常</li><li>外部中断（Interrupt）：能处理中断(<code>SR.IE</code>) &amp; 未在处理异常(<code>!SR.EXL</code>) &amp; 存在外部中断源且该中断源可以被处理(<code>SR.IM&amp;HWInt</code>)    <span id="mjx-dd656dc8">      <style>      #mjx-dd656dc8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>  需要处理外部中断（Interrupt置高）<ul><li>外部中断看情况处理！</li></ul></li><li>内部异常（Execption）：未在处理异常(<code>!SR.EXL</code>) &amp; 存在内部异常(ExcCodeIn)    <span id="mjx-b89432a8">      <style>      #mjx-b89432a8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>  需要处理内部异常（Execption置高）<ul><li>内部异常必须处理！</li></ul></li></ul></li><li><p>CP0何时被写？    <span id="mjx-60bf61d">      <style>      #mjx-60bf61d{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>  顺序如下：</p><ol><li>HWInt无论如何会被更新到Cause.IP</li><li>Req == 1更新SR.EXL/Cause.BD/EPC<ol><li>Exception?更新Cause.ExcCode，否则置零</li></ol></li><li>EXLclr == 1即：执行<code>eret</code>，将SR.EXL置零</li><li>CP0WE == 1写对应寄存器<ul><li>CP0 寄存器的初始值均为 0，<strong>未实现位始终保持 0</strong>。</li></ul></li></ol></li><li><p>CP0接线</p><ul><li>M_CP0WE\M_EXLclr来自控制信号M_ControlBus（增加Control）</li><li>M_PC来自M</li><li>M_ExcCodein来自内部异常检测，M_HWInt来自外部异常检测</li><li>M_BDin：BranchControl生成BDin信号，向后流水，从Reg_M取出</li><li>M_CP0RD：向后流水，传入WDsel</li><li>Req：接入IFU/Reg_D/Reg_E/Reg_M,实现精确异常</li><li>EPC：核心在于理解<mark>eret没有延迟槽</mark><ul><li>绝对不执行已经被取到F中的错误指令（eret后面紧跟的指令清空）</li><li><code>eret</code>指令在D时，插入一个 nop（类似likely清空延迟槽——D_Flush）</li></ul></li></ul></li><li><p>Req如何实现精确异常？</p><ul><li>精确异常：<ul><li>异常受害指令之前的所有指令都生效</li><li>异常指令以及之后的指令都不产生任何副作用</li><li>返回后从异常指令（or上一条<code>（BDin）</code>）重新执行</li></ul></li><li>流水线表现<ul><li>W级：正常执行</li><li>M级：指令停止，进入异常处理</li><li>E/D/F：flush</li></ul></li><li>优先级：reset &gt; Req &gt; stall &gt; (To_nop) &gt; likely造成的D_flush</li><li>具体实现<ul><li>IFU：PC跳转至异常处理地址</li><li>Reg_D：清空instr，PC正常流水</li><li>Reg_E：清空所有，PC、BD正常流水</li><li>Reg_M：清空所有，PC、BD正常流水</li><li>Reg_W：清空所有</li></ul></li><li>特别规定，在进入中断或异常状态时，如果受害指令及其后续指令已经改变了<code>MDU</code>的状态，则无需恢复。考虑以下情况：<ul><li><code>mult</code> 在 E 级启动了乘法运算(其它<code>乘除法指令</code>同理)，流水到 M 级时产生了中断<ul><li><strong>MDU不用恢复</strong></li></ul></li><li><code>mthi</code> 在 E 级修改了 HI 寄存器(<code>mtlo</code> 同理)，流水到 M 级时产生了中断。<ul><li><strong>MDU不用恢复</strong></li></ul></li><li><code>mult</code> 在 E 级，受害指令在 M 级，此时还<strong>未改变 MDU 状态</strong>，不应开始乘法计算，其它乘除法指令同理。</li><li><code>mthi</code> 在 E 级，受害指令在 M 级，此时还<strong>未改变 MDU 状态</strong>，不应修改 HI 寄存器的值，<code>mtlo</code> 同理。</li></ul></li></ul><p>总之：</p><ul><li>MDU接入req。如果<code>req&amp;!Busy</code>，那么MDU freeze（MDU不应开始运算/改变HI、LO状态）</li></ul></li><li><p>关于PC的处理</p><ul><li>核心问题：flush造成的nop的PC到底应该怎么取，才保证外部中断后EPC更新不出错？</li><li>nop的分类<ul><li>天然指令nop：不管</li><li>异常指令视作nop：PC、BDin、ExcCode正常流水，其它清零</li><li>D_flush替换的nop：PC正常流水</li><li>stall插入的bubble（nop）：PC、BDin正常流水，其它清零</li></ul></li></ul></li><li><p>中断和异常优先级：中断优先级高于异常优先级，即当有异常提交至 CP0 寄存器时，若有中断发生，则硬件应<strong>先响应中断</strong>（<code>强制将Cause.IP记为5'b0</code>）</p></li></ol><h2 id="内部异常检测与流水">内部异常检测与流水</h2><ul><li><p>异常与中断码</p><table><thead><tr><th>异常码</th><th>助记符与名称</th><th>指令与类型</th><th>描述</th></tr></thead><tbody><tr><td>0</td><td>Int（外部中断）</td><td>所有指令</td><td>中断请求，来源于计时器与外部中断。</td></tr><tr><td>4</td><td>AdEL（取指异常）</td><td>所有指令</td><td>PC 地址未字对齐。<br>PC 地址超过 0x3000 ~ 0x6ffc。</td></tr><tr><td>4</td><td>AdEL（取数异常）</td><td>lw</td><td>取数地址未与 4 字节对齐。</td></tr><tr><td></td><td></td><td>lh</td><td>取数地址未与 2 字节对齐。</td></tr><tr><td></td><td></td><td>lh, lb</td><td>取 Timer 寄存器的值。</td></tr><tr><td></td><td></td><td>load 型指令</td><td>计算地址时加法溢出。</td></tr><tr><td></td><td></td><td>load 型指令</td><td>取数地址超出 DM、Timer0、Timer1、中断发生器范围。</td></tr><tr><td>5</td><td>AdES（存数异常）</td><td>sw</td><td>存数地址未 4 字节对齐。</td></tr><tr><td></td><td></td><td>sh</td><td>存数地址未 2 字节对齐。</td></tr><tr><td></td><td></td><td>sh, sb</td><td>存 Timer 寄存器的值。</td></tr><tr><td></td><td></td><td>store 型指令</td><td>计算地址加法溢出。</td></tr><tr><td></td><td></td><td>store 型指令</td><td>向计时器 Count 寄存器存值。</td></tr><tr><td></td><td></td><td>store 型指令</td><td>存数地址超出 DM、Timer0、Timer1、中断发生器范围。</td></tr><tr><td>8</td><td>Syscall（系统调用）</td><td>syscall</td><td>系统调用。</td></tr><tr><td>10</td><td>RI（未知指令）</td><td>-</td><td>未知指令码。</td></tr><tr><td>12</td><td>Ov（溢出异常）</td><td>add, addi, sub</td><td>算术溢出。</td></tr></tbody></table></li><li><p>指令异常检测位置</p><table><thead><tr><th>异常与中断码</th><th>异常</th><th>检测位置（到该阶段才能检测）</th><th>检测指标</th></tr></thead><tbody><tr><td>0</td><td>外部中断Int</td><td>E</td><td>\</td></tr><tr><td>4</td><td>AdEL</td><td>D</td><td>PC</td></tr><tr><td>4</td><td>AdEL</td><td>E</td><td>ALUresult</td></tr><tr><td>5</td><td>AdES</td><td>E</td><td>ALUresult/operand1、operand2</td></tr><tr><td>8</td><td>Syscall</td><td>D</td><td>Instrction</td></tr><tr><td>10</td><td>RI（未知指令）</td><td>D</td><td>Instruction</td></tr><tr><td>12</td><td>Ov（算术溢出）</td><td>E</td><td>operand1、operand2、ALUop</td></tr></tbody></table></li><li><p>ExceptionDetect（指令异常检测模块）</p><ul><li>功能检测内部异常类型，生成ExcCode</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>D_ControlBus</td><td>I</td><td>32</td><td>D ControlBus</td></tr><tr><td>E_ControlBus</td><td>I</td><td>32</td><td>E ControlBus</td></tr><tr><td>D_PC</td><td>I</td><td>32</td><td>D PC</td></tr><tr><td>E_ExcCode</td><td>I</td><td>5</td><td>从E取出的ExcCode</td></tr><tr><td>E_operand1</td><td>I</td><td>32</td><td>ALU operand1</td></tr><tr><td>E_operand2</td><td>I</td><td>32</td><td>ALU operand2</td></tr><tr><td>D_ExcCode</td><td>O</td><td>5</td><td>存入E的ExcCode</td></tr><tr><td>E_NewExcCode</td><td>O</td><td>5</td><td>真正存入M的ExcCode</td></tr><tr><td>2nop</td><td>O</td><td>1</td><td>是否将D中指令视为nop</td></tr></tbody></table></li></ul></li><li><p>tips：</p><ul><li>发生取指异常或 RI 异常后视为 nop 直至提交到 CP0（保留BDin，PC和ExcCode）</li><li>内部异常优先级：AdEL最大（先有取，再有译）</li><li>Timer中count映射的地址？<ul><li>看Timer中count的定义 &amp; 整个Timer映射的地址范围</li><li>e.g.<ul><li>Timer0: <code>0x0000_7F00 ~ 0x0000_7F0B</code>   （长度 12 字节 = 3 个 4 字节寄存器）</li><li>Timer:``define count  mem[2]`</li><li>    <span id="mjx-6547ea7">      <style>      #mjx-6547ea7{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>  count:<code>0x0000_7F08 ~ 0x0000_7F0B</code></li></ul></li></ul></li></ul></li></ul><h2 id="BDinGenerator">BDinGenerator</h2><ul><li><p>BDin    <span id="mjx-66ea64a">      <style>      #mjx-66ea64a{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   异常发生的这条指令是否位于延迟槽（B/J - 延迟槽（该指令））    <span id="mjx-b686cc58">      <style>      #mjx-b686cc58{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   上一条指令是不是B/J</p></li><li><p>功能生成BDin，向后流水</p></li><li><p>原理分支跳转指令无论跳转与否，延迟槽指令为受害指令时 BD 均需要置位。</p></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>D_ifB</td><td>I</td><td>1</td><td>D级指令是否是B指令</td></tr><tr><td>D_ifJ</td><td>I</td><td>1</td><td>D级指令是否是J指令</td></tr><tr><td>BDin</td><td>O</td><td>1</td><td>D级指令紧跟的指令是否位于延迟槽</td></tr></tbody></table></li></ul><p>tip：<code>eret</code>没有延迟槽但要跳转</p><h2 id="Bridge系统桥">Bridge系统桥</h2><ul><li><p>功能</p><ol><li>地址解码：当前地址属于哪个设备</li><li>把CPU的读写信号、写数据转发给对应外设</li><li>从对应外设返回数据给CPU</li></ol></li><li><p>架构</p><pre><code>  CPU 给地址、数据、byteen  ↓  Bridge 内部解码  ↓  Bridge 产生 DM_Byteen / Timer_Byteen / Int_Byteen  ↓  Bridge 选择外设返回数据 RD</code></pre></li></ul><h2 id="计时器">计时器</h2><ul><li>功能：根据设定的时间来定时产生中断信号</li></ul><h2 id="单周期CPU的封装">单周期CPU的封装</h2><p>宏观PC：M_PC</p><h2 id="HCU新增控制">HCU新增控制</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wire stall_eret = D_eret &amp; (</span><br><span class="line">    (E_mtc0 &amp; (E_rd_addr == 5&#x27;d14)) ||</span><br><span class="line">    (M_mtc0 &amp; (M_rd_addr == 5&#x27;d14))</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="DM">DM</h2><ul><li>DM写入要屏蔽异常<code>wire M_TrueMemWrite = M_MemWrite &amp; (!Req)</code></li></ul><h1 id="思考题">思考题</h1><ol><li><p>请查阅相关资料，说明鼠标和键盘的输入信号是如何被 CPU 知晓的？</p><ul><li>通过外设控制器发出的中断信号 + OS 注册的中断服务程序，CPU 被动接收并处理输入数据。</li></ul></li><li><p>请思考为什么我们的 CPU 处理中断异常必须是已经指定好的地址？如果你的 CPU 支持用户自定义入口地址，即处理中断异常的程序由用户提供，其还能提供我们所希望的功能吗？如果可以，请说明这样可能会出现什么问题？否则举例说明。（假设用户提供的中断处理程序合法）</p><ul><li>CPU 在异常发生时必须立即进入可信、统一、受保护的处理入口，才能保证系统继续正确运行。</li><li>如果允许用户自定义入口，虽然仍能处理中断，但会出现无法保存现场、破坏内核权限、系统不可恢复等问题，使 CPU 无法提供可靠的操作系统支持。</li></ul></li><li><p>为何与外设通信需要 Bridge？</p><ul><li>我们可能随时需要增加外设，但不可能每增加一种外设就给CPU增加响应接口。为此我们设计Bridge来连接外设和CPU，将所有外设都映射为一段地址（“DM”），使得CPU能以统一的方式访问不同外设。</li></ul></li><li><p>请阅读官方提供的定时器源代码，阐述两种中断模式的异同，并分别针对每一种模式绘制状态移图。</p><ul><li>异：计时结束动作不同<ul><li>模式0：单次中断，计时结束持续输出中断信号</li><li>模式1：循环计时，每次计时归零输出一周期中断信号</li></ul></li><li>同：计时过程相同<img src="/images/CO/P7/timer.jpg" alt="timer"></li></ul></li><li><p>倘若中断信号流入的时候，在检测宏观 PC 的一级如果是一条空泡（你的 CPU 该级所有信息均为空）指令，此时会发生什么问题？在此例基础上请思考：在 P7 中，清空流水线产生的空泡指令应该保留原指令的哪些信息？</p><ul><li>问题：EPC出错</li><li>保留PC、BDin</li></ul></li><li><p>为什么 jalr 指令为什么不能写成 jalr $31, $31？</p><ul><li>从jalr的语义来看，PC转向被调用函数，函数入口地址保存在 GPR[rs]中。但如果rs和rd相同，那么将PC+8写入rd的操作就会覆盖保存的函数入口地址，使得程序无法返回调用点。</li></ul></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/CO/P7/image.png&quot; alt=&quot;通关纪念！&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;目标简述&quot;&gt;目标简述&lt;/h1&gt;
&lt;p&gt;在P6的基础上，实现一个简单的计算机系统（MIPS微系统）。&lt;/p&gt;
&lt;h2 id=&quot;三种外设&quot;&gt;三种外设&lt;/h2&gt;</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-CO-P6 基于verilog的流水线MIPS架构CPU（2）</title>
    <link href="https://crazyinloo.github.io/2025/12/01/CO-P6/"/>
    <id>https://crazyinloo.github.io/2025/12/01/CO-P6/</id>
    <published>2025-12-01T12:59:00.000Z</published>
    <updated>2025-12-02T07:24:02.879Z</updated>
    
    <content type="html"><![CDATA[<h1 id="任务">任务</h1><ul><li><p>将P5中支持{add,sub,ori,lui,lw,sw,beq,jr,jal,nop}十条指令的CPU扩展，要求支持以下指令集：</p><pre><code>      add,sub,and,or,slt,sltu,      addi,andi,ori,lui,      mult,multu,div,divu,mfhi,mflo,mthi,mtlo,      lw,lb,lh,sw,sb,sh,      beq,bne,jr,jal,      nop</code></pre></li><li><p>不再自行模拟IM和DM，而由提供的外设传递instruction和相关数据给CPU</p></li></ul><h1 id="前提">前提</h1><ol><li>不会连续出现乘除指令</li><li>乘除指令之后一定是mfhi/mflo</li></ol><h1 id="需要改动的地方">需要改动的地方</h1><h2 id="IM和DM">IM和DM</h2><p>不用自己实现IM和DM了。</p><ul><li>相当于给出了IM和DM的外置设备，只需要考虑怎么将cpu和IM、DM连接起来</li><li>在MEM阶段设置BE模块来负责数据交互<ul><li>原MemWrite变为byteEn总开关</li><li>原MemRead现在没有意义了</li></ul></li></ul><h2 id="MDU">MDU</h2><p>在EX阶段新增乘除模块来实现乘除相关指令</p><ul><li>我们只需要把乘除法相关指令阻塞在D</li><li>在HCU中增加MD_stall的判断</li></ul><h2 id="Control">Control</h2><p>指令集规模扩大，为提高添加指令的效率和conrol代码的简洁性，我们对指令进行分类，可大致分为：- R_cal- I_cal- MD- Load &amp; Save- Branch &amp; Jump</p><h1 id="计算用组合逻辑积累">计算用组合逻辑积累</h1><ol><li>乘除相关 <figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//madd</span></span><br><span class="line">&#123;temp_hi, temp_lo&#125; &lt;= &#123;hi, lo&#125; + <span class="built_in">$signed</span>(<span class="built_in">$signed</span>(<span class="number">64&#x27;d0</span>) + <span class="built_in">$signed</span>(rs) * <span class="built_in">$signed</span>(rt));</span><br><span class="line"><span class="comment">// 或者</span></span><br><span class="line">&#123;temp_hi, temp_lo&#125; &lt;= &#123;hi, lo&#125; + <span class="built_in">$signed</span>(&#123;&#123;<span class="number">32</span>&#123;rs[<span class="number">31</span>]&#125;&#125;, rs[<span class="number">31</span>:<span class="number">0</span>]&#125; * <span class="built_in">$signed</span>(&#123;&#123;<span class="number">32</span>&#123;rt[<span class="number">31</span>]&#125;&#125;, rt[<span class="number">31</span>:<span class="number">0</span>]&#125;)); <span class="comment">// 手动进行符号位扩展</span></span><br></pre></td></tr></table></figure></li></ol><h1 id="模块设计">模块设计</h1><h2 id="ID">ID</h2><h3 id="HCU">HCU</h3><ul><li>转发：新增了数据来源（M_HI/M_LO）<table><thead><tr><th>转发到/数据来源</th><th>M锁存的ALUresult</th><th>W_WD</th><th>M_PC8</th><th>M_HI</th><th>M_LO</th><th>E_PC8</th></tr></thead><tbody><tr><td>ID stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td></tr><tr><td>EX stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>不存在</td></tr><tr><td>MEM stage</td><td>不存在</td><td>RtData</td><td>不存在</td><td>不存在</td><td>不存在</td><td>不存在</td></tr></tbody></table></li><li>暂停：增加了MD_stall<ul><li><code>assign MD_stall = (D_isMDinstr &amp; (E_MDUop != 3'b0 | E_Busy));</code></li><li>即：当E中MDU<code>start/busy</code>且D中为MD相关指令，<strong>stall</strong></li></ul></li></ul><h2 id="EX">EX</h2><h3 id="MDU-2">MDU</h3><ul><li>整体设计<ul><li>能够实现和乘除有关的功能</li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>同步复位</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>clk</td></tr><tr><td>op</td><td>I</td><td>3</td><td>MDUop<br>000:未start<br>001:mult start<br>010:multu start <br>011:div start <br>100:divu start</td></tr><tr><td>operand1</td><td>I</td><td>32</td><td>默认RsData</td></tr><tr><td>operand2</td><td>I</td><td>32</td><td>默认RtData</td></tr><tr><td>we_HI</td><td>I</td><td>1</td><td>HI写使能信号</td></tr><tr><td>we_LO</td><td>I</td><td>1</td><td>LO写使能信号</td></tr><tr><td>Busy</td><td>O</td><td>1</td><td>MDU繁忙信号</td></tr><tr><td>HI</td><td>O</td><td>32</td><td>HI data</td></tr><tr><td>LO</td><td>O</td><td>32</td><td>LO data</td></tr></tbody></table></li></ul><h2 id="MEM">MEM</h2><h3 id="BE">BE</h3><ul><li>模块设计<ul><li>将字节写使能信号传入外设DM</li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>Address</td><td>I</td><td>32</td><td>读/写地址，<mark><strong>默认是ALUresult</strong></mark></td></tr><tr><td>MemWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>LoadType</td><td>I</td><td>2</td><td>load模式选择信号</td></tr><tr><td>SaveType</td><td>I</td><td>2</td><td>Save模式选择信号</td></tr><tr><td>MemWriteData</td><td>I</td><td>32</td><td>要被处理准备被写入的数据</td></tr><tr><td>MemReadData</td><td>从DM中读出的对应Word</td><td></td><td></td></tr><tr><td>LoadData</td><td>O</td><td>32</td><td>要Load到rt中的数据</td></tr><tr><td>SaveData</td><td>O</td><td>32</td><td>要Save到DM中的数据</td></tr><tr><td>byteEn</td><td>O</td><td>4</td><td>要Save到DM对应字的字节位置</td></tr></tbody></table></li></ul><h1 id="思考题">思考题</h1><ol><li><p>为什么需要有单独的乘除法部件而不是整合进 ALU？为何需要有独立的 HI、LO 寄存器？</p><ul><li>乘除的实现时间远长于ALU中的简单运算，如果整合进去，那么EX阶段的时间就会被拉长，降低效率</li><li>独立的HI、LO：<ol><li>运算结果是<code>64位/两个数</code>，而通用寄存器只有<code>32位</code>;</li><li>可以简化寄存器堆的写回逻辑（否则GRF要实现同时写入两个数据，与现有GRF结构不同）</li></ol></li></ul></li><li><p>真实的流水线 CPU 是如何使用实现乘除法的？请查阅相关资料进行简单说明。</p><ul><li>真实的CPU实际上是通过<code>专用硬件电路 + 内部流水线 + 乱序调度</code>来实现乘法，而除法通过使用 <code>SRT 算法</code>来实现(搜索得到)</li></ul></li><li><p>请结合自己的实现分析，你是如何处理 Busy 信号带来的周期阻塞的？</p><ul><li>我在MDU内部设计了count来计算阻塞周期数，实际上这就是一个有限状态机的实现。</li><li>在HCU中增加了MD_stall(具体见上MDU)</li></ul></li><li><p>请问采用字节使能信号的方式处理写指令有什么好处？（提示：从清晰性、统一性等角度考虑）</p><ul><li>DM内部不再需要区分写入指令的方法（sw/sb/sh/…),它只需要根据Address和字节使能信号决定要不要写入。</li></ul></li><li><p>请思考，我们在按字节读和按字节写时，实际从 DM 获得的数据和向 DM 写入的数据是否是一字节？在什么情况下我们按字节读和按字节写的效率会高于按字读和按字写呢？</p><ul><li>不是，是一个字</li><li>当我们需要紧密地存储数据时，按字节读写效率会更高（比如处理字符串时）</li></ul></li><li><p>为了对抗复杂性你采取了哪些抽象和规范手段？这些手段在译码和处理数据冲突的时候有什么样的特点与帮助？</p><ul><li>把控制信号合成为总线向后传，要用的时候再利用宏取出。当需要新增控制信号（如增加乘除法相关的 we_HI/LO）时，只需修改位宽定义和宏，而无需修改流水线寄存器（Reg_E, Reg_M等）的端口列表；</li><li>在增加指令时把指令分为R-cal\I-cal\Branch and Jump\Load and Save\MD相关，再把它加入对应的控制信号表。填表的过程就是梳理指令全过程、思考待改变模块的过程，因此填完表之后基本就知道要怎么修改cpu。</li><li>转发采取from - to的思路，只要增加的指令没有涉及到转发source的增加就不用改HCU。（如果要改，类似：添加MD相关指令之后，在HCU和顶层数据选择逻辑中加入了M_HI/M_LO,在WDsel的来源中增加了W_HI/W_LO)</li></ul></li><li><p>在本实验中你遇到了哪些不同指令类型组合产生的冲突？你又是如何解决的？相应的测试样例是什么样的？</p><ul><li>转发：按照以下from - to表来列举<table><thead><tr><th>转发到/数据来源</th><th>M锁存的ALUresult</th><th>W_WD</th><th>M_PC8</th><th>M_HI</th><th>M_LO</th><th>E_PC8</th></tr></thead><tbody><tr><td>ID stage</td><td>R_cal/I_cal - nop - Branch</td><td>R_cal/I_cal/Load - nop - nop - Branch</td><td>jal - (jump处)nop - Branch</td><td>mfhi - nop - Branch</td><td>mflo - nop - Branch</td><td>jal - (jump处)Branch</td></tr><tr><td>EX stage</td><td>R_cal/I_cal - R_cal/I_cal/MD相关</td><td>R_cal/I_cal/MD相关/jal/Load - nop - R_cal/I_cal/MD相关</td><td>jal - (jump处)R_cal/I_cal/MD相关</td><td>mfhi - R_cal/I_cal/MD相关</td><td>mflo - R_cal/I_cal/MD相关</td><td>不存在</td></tr><tr><td>MEM stage</td><td>不存在</td><td>R_cal/I_cal/MD相关/jal/Load - Save</td><td>不存在</td><td>不存在</td><td>不存在</td><td>不存在</td></tr></tbody></table></li><li>暂停：<ul><li>E_Conflict： <figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ori </span>$<span class="number">1</span>,$<span class="number">0</span>,<span class="number">3</span></span><br><span class="line"><span class="keyword">beq </span>$<span class="number">1</span>,$<span class="number">0</span>,label</span><br><span class="line"><span class="symbol">label:</span></span><br><span class="line"><span class="keyword">nop</span></span><br></pre></td></tr></table></figure></li><li>M_Conflict： <figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">lw </span>$<span class="number">1</span>, <span class="number">0</span>($<span class="number">0</span>)      </span><br><span class="line"><span class="keyword">nop </span>                </span><br><span class="line"><span class="keyword">beq </span>$<span class="number">1</span>, $<span class="number">0</span>, label  </span><br><span class="line"><span class="symbol">label:</span></span><br><span class="line"><span class="keyword">nop</span></span><br></pre></td></tr></table></figure></li></ul></li></ul></li><li><p>如果你是手动构造的样例，请说明构造策略，说明你的测试程序如何保证覆盖了所有需要测试的情况；如果你是完全随机生成的测试样例，请思考完全随机的测试程序有何不足之处；如果你在生成测试样例时采用了特殊的策略，比如构造连续数据冒险序列，请你描述一下你使用的策略如何结合了随机性达到强测的效果。</p><ul><li>手动构造：<ul><li>根据7中表格覆盖每一种转发和暂停的场合</li><li>加入 $0 寄存器作为读写目标，确保不会错误地覆盖 $0 的值</li></ul></li></ul></li></ol><h1 id="Control表">Control表</h1><h2 id="R-cal">R_cal</h2><table><thead><tr><th>控制信号\指令</th><th>add</th><th>sub</th><th>and</th><th>or</th><th>slt</th><th>sltu</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>aluControlSel</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>ALUop</td><td>0000</td><td>0001</td><td>0010</td><td>0011</td><td>0101</td><td>0110</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>RegDst</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>WDsel</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ifJ</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>useRt</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>islink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>LoadType</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>SaveType</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MDUop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>we_HI</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>we_LO</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr></tbody></table><h2 id="I-cal">I_cal</h2><table><thead><tr><th>控制信号\指令</th><th>addi</th><th>andi</th><th>ori</th><th>lui</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>aluControlSel</td><td>001</td><td>001</td><td>001</td><td>001</td></tr><tr><td>ALUop</td><td>0000</td><td>0010</td><td>0011</td><td>0100</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>RegDst</td><td>001</td><td>001</td><td>001</td><td>001</td></tr><tr><td>WDsel</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ifJ</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>useRt</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>islink</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>LoadType</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>SaveType</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MDUop</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>we_HI</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>we_LO</td><td>0</td><td>0</td><td>0</td><td>0</td></tr></tbody></table><h2 id="MD相关">MD相关</h2><table><thead><tr><th>控制信号\指令</th><th>mult</th><th>multu</th><th>div</th><th>divu</th><th>mfhi</th><th>mflo</th><th>mthi</th><th>mtlo</th></tr></thead><tbody><tr><td>RegWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td></tr><tr><td>aluControlSel</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ALUop</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td></td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>RegDst</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>WDsel</td><td>000</td><td>000</td><td>000</td><td>000</td><td>011</td><td>100</td><td>000</td><td>000</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ifJ</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>useRt</td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>islink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>LoadType</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>SaveType</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MDUop</td><td>001</td><td>010</td><td>011</td><td>100</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>we_HI</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td></tr><tr><td>we_LO</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td></tr></tbody></table><h2 id="Load-Save">Load &amp; Save</h2><table><thead><tr><th>控制信号\指令</th><th>lb</th><th>lh</th><th>lw</th><th>sb</th><th>sh</th><th>sw</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>aluControlSel</td><td>001</td><td>001</td><td>001</td><td>001</td><td>001</td><td>001</td></tr><tr><td>ALUop</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td></tr><tr><td>MemRead</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>RegDst</td><td>001</td><td>001</td><td>001</td><td>000</td><td>000</td><td>000</td></tr><tr><td>WDsel</td><td>01</td><td>01</td><td>01</td><td>00</td><td>00</td><td>00</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ifJ</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>useRt</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td></tr><tr><td>islink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>LoadType</td><td>010</td><td>100</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>SaveType</td><td>0000</td><td>0000</td><td>0000</td><td>0010</td><td>0001</td><td>0000</td></tr><tr><td>MDUop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>we_HI</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>we_LO</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr></tbody></table><h2 id="Branch-Jump">Branch &amp; Jump</h2><table><thead><tr><th>控制信号\指令</th><th>beq</th><th>jal</th><th>jr</th><th>bne</th></tr></thead><tbody><tr><td>RegWrite</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>aluControlSel</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>ALUop</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>1</td><td>0</td><td>0</td><td>1</td></tr><tr><td>RegDst</td><td>000</td><td>011</td><td>000</td><td>000</td></tr><tr><td>WDsel</td><td>00</td><td>10</td><td>00</td><td>00</td></tr><tr><td>NPCop</td><td>001</td><td>010</td><td>011</td><td>001</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>1</td><td>0</td><td>0</td><td>1</td></tr><tr><td>ifJ</td><td>0</td><td>1</td><td>1</td><td>0</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>001</td></tr><tr><td>useRt</td><td>1</td><td>0</td><td>0</td><td>1</td></tr><tr><td>islink</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>LoadType</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>SaveType</td><td>0000</td><td>0000</td><td>0000</td><td>0000</td></tr><tr><td>MDUop</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>we_HI</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>we_LO</td><td>0</td><td>0</td><td>0</td><td>0</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;任务&quot;&gt;任务&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;将P5中支持{add,sub,ori,lui,lw,sw,beq,jr,jal,nop}十条指令的CPU扩展，要求支持以下指令集：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;      add,sub,and,or,slt,s</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-COT 使用手册</title>
    <link href="https://crazyinloo.github.io/2025/11/24/COT%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/"/>
    <id>https://crazyinloo.github.io/2025/11/24/COT%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/</id>
    <published>2025-11-24T12:56:00.000Z</published>
    <updated>2025-11-24T15:00:50.333Z</updated>
    
    <content type="html"><![CDATA[<h1 id="声明">声明</h1><p>本文所介绍的工具 <code>COT</code> 来自开源项目，其源代码与详细信息可见：<a href="https://github.com/Kie-Chi/COT">COT</a></p><p>该项目版权归原作者所有，并遵循其仓库中所标注的开源许可证。本文仅对其使用方法进行学习性说明，所有原始代码与设计均由原作者贡献。若本文中引用了项目中的代码或截图，均仅用于技术交流目的。</p><h1 id="配置问题">配置问题</h1><h2 id="问题1">问题1</h2><p>我按说明执行<code>start.exe</code>之后出现如下报错：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">Mars: Start dumping datas...</span><br><span class="line">arth_test.asm: Mars is dumping data...</span><br><span class="line">ERROR: UnicodeDecodeError&quot;&#x27;utf-8&#x27; codec can&#x27;t decode byte 0xd4 in position 4: invalid continuation byte&quot;</span><br><span class="line">Detailed Stacktree:</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">File &quot;start.py&quot;, line 187, in test</span><br><span class="line">    self.machine.start_test()</span><br><span class="line">File &quot;Machine.py&quot;, line 38, in start_test</span><br><span class="line">    self.__get_std_mars()</span><br><span class="line">File &quot;Machine.py&quot;, line 206, in __get_std_mars</span><br><span class="line">    self.__runner.run_mars(src, hex_dst, out_log)</span><br><span class="line">File &quot;Runner.py&quot;, line 142, in run_mars</span><br><span class="line">    self.dump_hex(src, hex_dst)</span><br><span class="line">File &quot;Runner.py&quot;, line 63, in dump_hex</span><br><span class="line">    contents = safe_read(os.path.join(self._dir, &quot;info.txt&quot;))</span><br><span class="line">File &quot;Runner.py&quot;, line 640, in safe_read</span><br><span class="line">    contents = file.readlines()</span><br><span class="line">File &quot;codecs.py&quot;, line 322, in decode</span><br><span class="line">UnicodeDecodeError: &#x27;utf-8&#x27; codec can&#x27;t decode byte 0xd4 in position 4: invalid continuation byte</span><br></pre></td></tr></table></figure><h3 id="解决方法">解决方法</h3><p>把 Windows 的“语言用于非 Unicode 程序”改成 English<code>控制面板 → 区域 → 管理 → 非 Unicode 程序语言 → 改为 English(United States) </code></p><h3 id="原理">原理</h3><p><code>MARS/Java</code> 输出用的是系统默认编码（ACP），中文是 <code>GBK</code>，会产生 <code>UTF-8</code> 不能解码的字节；切成英文后输出主要是 ASCII，不再产生非法字节，UTF-8 读取自然不报错。</p><h2 id="问题2">问题2</h2><p>运行cot发现输出永远为空</p><h3 id="解决方法-2">解决方法</h3><p>修改系统<strong>环境变量</strong></p><ol><li>添加<code>系统变量</code>变量名：<code>XILINX</code>变量值：<code>D:\Xilinx\14.7\ISE_DS\ISE</code>（ISE位置）</li><li>新增PATH系统变量中选中PATH - 编辑 - 新建<ul><li><code>D:\Xilinx\14.7\ISE_DS\ISE\lib\nt64</code></li><li><code>D:\Xilinx\14.7\ISE_DS\ISE\bin\nt64</code></li></ul></li></ol><h2 id="选择评测cpu">选择评测cpu</h2><p>如下图，直接链接到cpu所在文件夹即可，评测机不会修改cpu内容。<img src="/images/CO/COT/image.png" alt="cpu地址设置"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;声明&quot;&gt;声明&lt;/h1&gt;
&lt;p&gt;本文所介绍的工具 &lt;code&gt;COT&lt;/code&gt; 来自开源项目，其源代码与详细信息可见：
&lt;a href=&quot;https://github.com/Kie-Chi/COT&quot;&gt;COT&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;该项目版权归原作者所有，并遵循</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-CO-P5 基于verilog的流水线MIPS架构CPU（1）</title>
    <link href="https://crazyinloo.github.io/2025/11/24/CO-P5/"/>
    <id>https://crazyinloo.github.io/2025/11/24/CO-P5/</id>
    <published>2025-11-24T12:54:00.000Z</published>
    <updated>2025-11-24T13:06:08.592Z</updated>
    
    <content type="html"><![CDATA[<h1 id="要求">要求</h1><ul><li>全力转发！</li><li>支持指令集：{add,sub,ori,lui,lw,sw,beq,jr,jal,nop}</li></ul><h1 id="需要重构的地方">需要重构的地方</h1><h2 id="译码方式">译码方式</h2><pre><code>选择集中式译码 &amp; 控制信号驱动型译码</code></pre><p>e.g.</p>   <figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">  <span class="comment">//宏定义</span></span><br><span class="line">   <span class="meta">`<span class="keyword">define</span> ADDU 6&#x27;b100001</span></span><br><span class="line">   <span class="meta">`<span class="keyword">define</span> RTYPE  6&#x27;b000000;</span></span><br><span class="line">   <span class="comment">//定义信号</span></span><br><span class="line">   <span class="keyword">wire</span> Rtype,addu;</span><br><span class="line">   <span class="keyword">wire</span> [<span class="number">1</span>:<span class="number">0</span>]NPCOp;</span><br><span class="line">   <span class="keyword">wire</span> RFWr;</span><br><span class="line">   <span class="comment">//decode</span></span><br><span class="line">   <span class="keyword">assign</span> RType = (opcode == RTYPE);</span><br><span class="line"><span class="keyword">assign</span> addu  =  RType&amp;(funct == ADDU);</span><br><span class="line">   <span class="comment">//生成控制信号</span></span><br><span class="line">   <span class="keyword">assign</span> NPCOp[<span class="number">0</span>] = beq | jr | jalr;</span><br><span class="line"><span class="keyword">assign</span> NPCOp[<span class="number">1</span>] = jal | jr | jalr | j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">assign</span> RFWr = addu | subu | ori | lw | jal | lui | lb | lh | addi | jalr ;</span><br></pre></td></tr></table></figure><h2 id="Splitter">Splitter</h2><p>要取代的：</p><ol><li>ControlSplitter</li><li>InstrSplitter</li></ol><ul><li>核心思想：用<strong>宏定义</strong>代替splitter<ul><li>各种控制信号在D级生成后打包成controlbus向后传</li><li>instruction和controlbus都直接完整向后传，如果要用再利用宏定义在对应阶段取出即可</li></ul></li></ul><h2 id="宏">宏</h2><p>专门建立一个<code>define.v</code>,在里面进行宏定义</p><figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// constants.v</span></span><br><span class="line"><span class="meta">`<span class="keyword">ifndef</span> DEFINES_V</span></span><br><span class="line"><span class="meta">`<span class="keyword">define</span> DEFINES_V</span></span><br><span class="line">    <span class="comment">//宏定义</span></span><br><span class="line"><span class="meta">`<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><p>这样可以保证不重复宏定义</p><h2 id="命名方式">命名方式</h2><p><code>E_xx</code>:来自E Register的 xx 值/在E stage产生的 xx 值</p><h2 id="添加BranchControl模块">添加BranchControl模块</h2><p>把<code>原alu输出equal等跳转判断信号</code>和<code>原npc使用equal等信号判断是否跳转</code>的功能集成到BranchControl模块中。</p><ul><li>实现分支判断提前到ID</li></ul><h2 id="拆分P4中的grfSel模块">拆分P4中的grfSel模块</h2><p>grfSel = WASel + WDSel</p><ul><li>WASel：放在ID中实现，然后一路传递</li><li>WDSel：WB中实现</li></ul><h2 id="GRF内部转发">GRF内部转发</h2><ul><li><p>当GRF同时在WB被写入，在ID被读出，且存在读写寄存器冲突，读出的寄存器值应为新写入的值</p>  <figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">assign</span> RD1 = (RA1 != <span class="number">0</span> &amp;&amp; RA1 == WA &amp;&amp; RegWrite) ? WD : register[RA1];</span><br><span class="line"><span class="keyword">assign</span> RD2 = (RA2 != <span class="number">0</span> &amp;&amp; RA2 == WA &amp;&amp; RegWrite) ? WD : register[RA2];</span><br></pre></td></tr></table></figure></li></ul><h1 id="前置知识">前置知识</h1><h2 id="延迟槽">延迟槽</h2><p>    <span id="mjx-d00d56b">      <style>      #mjx-d00d56b{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   跳转指令的下一条指令必执行一次（下一条指令已经在IF被取出）</p><h2 id="时序相关">时序相关</h2><p><img src="/images/CO/P5/%E6%97%B6%E5%BA%8F.png" alt="时序"></p><ul><li><mark>规定</mark>：<code>CCn的上升沿</code> 指的是 <code>CCn开始的上升沿</code></li><li>初始状态：第0个周期，实际上已经预加载了第一条指令的IF阶段。也就是说，<code>CC1上升沿</code>第一条指令实际上是<code>进入ID阶段。</code></li></ul><h2 id="冒险">冒险</h2><h3 id="数据冒险">数据冒险</h3><ul><li><p>转发/旁路:</p><ul><li>概念：将尚<code>未写入RF</code>但<mark>已经暂存</mark>在流水线寄存器中的<code>计算结果</code>传递给相关功能部件(或流水线寄存器)的技术</li><li>基本要点：<ol><li>前递：将M（后级）<mark>保存的</mark>ALUresult向EX stage（前级）的ALU传递</li><li>选择：<ol><li>有依赖才转发</li><li>不依赖不转发，就直接用grf读出的数据参与计算</li></ol></li><li>转发的数据一定是<mark>已经锁存过</mark>的数据，而不能从正在计算的组合逻辑里拉线！！！</li></ol></li></ul></li><li><p>完备性</p><table><thead><tr><th>转发到/数据来源</th><th>M锁存的ALUresult</th><th>W_WD</th><th>M_PC8</th><th>E_PC8</th></tr></thead><tbody><tr><td>ID stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td></tr><tr><td>EX stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td><td>不存在</td></tr><tr><td>MEM stage</td><td>不存在</td><td>RtData</td><td>不存在</td><td>不存在</td></tr></tbody></table><p>例如：</p><ul><li>lw - R：<ul><li>lw处于ME时插入空拍，R指令仍处于ID stage，PC冻结；</li><li>lw处于WB时，R型指令进入EX stage，将W_reg暂存的计算结果转发到ALU输入端（<code>代替operand1/operand2</code>）</li></ul></li><li>lw - xxx - R：<ul><li>R型指令处于ID stage时，将W_reg暂存的计算结果转发进E_reg（<code>代替RsData/RtData</code>）</li></ul></li></ul></li><li><p>阻塞的实现</p><ul><li>冻结PC</li><li>冻结D_reg</li><li>清零E_reg （本质上是向EX stage插入nop指令）</li></ul></li></ul><h3 id="控制冒险">控制冒险</h3><ul><li>提前分支判断：在D级就完成分支判断（已经用D级 BranchControl模块实现）</li><li>延迟槽：即使判断跳转，也至少让紧接着的那条指令执行（<strong>不用舍弃</strong>IF已经取到的指令）</li></ul><h1 id="加指令思路">加指令思路</h1><h2 id="分析指令RTL">分析指令RTL</h2><p><mark>严格按照指令说明来！！！</mark></p><ol><li>branch类</li></ol><ul><li>修改<code>BranchControl</code>对<code>ifLink</code>、<code>D_flush</code>和<code>BranchEn</code>的输出逻辑</li><li>清空延迟槽（<code>NullifyCurrentInstruction()</code>） = <code>D_flush</code>（清空延迟槽）</li></ul><ol start="2"><li>是否为条件写寄存器？改造类似<code>条件link</code>：<code>ControlBus</code>添加<code>isConditionalWrite</code>，在能确定是否写入的阶段设置<code>ifConditionalWrite</code>并随流水线向后传递，参与<code>TrueRegWrite</code>的选择实现。<ol><li>涉及访存的条件写：在MEM阶段才能确定是否要写入（M_TrueRegWrite\W_TrueRegWrite)</li><li>不涉及访存的条件写：在ID阶段就可以确定是否要写入</li></ol></li><li>是否为条件选择写入寄存器数据？<ol><li>不涉及到访存：增加ALU逻辑即可，在MEM阶段确定写入的数据</li><li>涉及到访存：增加ALU逻辑 &amp; 增加WDsel逻辑，在WB阶段确定写入的数据（本质：lw）</li></ol></li></ol><h2 id="易错点">易错点</h2><ol><li>STALL时不能清空延迟槽（因为此时D级还没有取到正确的data，分支判断无法进行，输出的D_flush不对）<ul><li>STALL &gt; D_flush</li></ul></li></ol><h2 id="计算用组合逻辑积累">计算用组合逻辑积累</h2><ol><li><p>rtData是否为rsData相反数？<code>wire isNegPair =  (rsData + rtData == 0) &amp;&amp; (rsData != 32'h8000_0000);</code><img src="/images/CO/P5/%E7%9B%B8%E5%8F%8D%E6%95%B0.png" alt="相反数"></p></li><li><p>取部分信号<code>data[i*4 +:4]</code>等价于<code>data[i*4+3:i*4]</code></p></li><li><p>对比有无符号</p><ul><li>默认无符号</li><li><code>$signed()</code></li></ul></li><li><p>判断奇偶wire isOdd  = rsData[0];wire isEven = ~rsData[0];</p></li><li><p>判断是否是2^n    <span id="mjx-611a791">      <style>      #mjx-611a791{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   只有一个 bit 是 1</p></li><li><p>是否为 rs 的绝对值比 rt 大</p></li></ol>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wire absgt =</span><br><span class="line"> ($signed(rsData[31] ? -rsData : rsData)) &gt;</span><br><span class="line"> ($signed(rtData[31] ? -rtData : rtData));</span><br></pre></td></tr></table></figure><h1 id="模块设计">模块设计</h1><h2 id="顶层设计">顶层设计</h2><p><img src="/images/CO/P5/P5%E9%A1%B6%E5%B1%82%E8%AE%BE%E8%AE%A1.png" alt="mips.v"></p><h2 id="数据通路">数据通路</h2><ul><li><p>五个转发去处(D_NewRsData/D_NewRtData/E_NewRsData/E_NewRtData/M_NewRtData)：</p></li><li><p>本质上是两种转发来源</p><ul><li>来自M级：ALUresult、PC+4</li><li>来自W级：WD</li></ul></li><li><p>以D_NewRsData为例:<img src="/images/CO/P5/D_RsData%E6%95%B0%E6%8D%AE%E6%9D%A5%E6%BA%90.png" alt="D_RsData数据来源"></p></li></ul><h2 id="IF">IF</h2><h3 id="IFU">IFU</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>NPC</td><td>I</td><td>32</td><td>pc更新值</td></tr><tr><td>stall</td><td>I</td><td>32</td><td>冻住</td></tr><tr><td>instruction</td><td>O</td><td>32</td><td>指令机器码</td></tr><tr><td>PC</td><td>O</td><td>32</td><td>当前PC</td></tr></tbody></table></li></ul><h2 id="D">D</h2><h3 id="Reg-D">Reg_D</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>clk</td><td>I</td><td>1</td><td>clock</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>F_instruction</td><td>I</td><td>32</td><td>F_instruction</td></tr><tr><td>F_PC</td><td>I</td><td>32</td><td>F_PC</td></tr><tr><td>stall</td><td>I</td><td>1</td><td>冻住</td></tr><tr><td>D_flush</td><td>I</td><td>1</td><td>是否清空延迟槽</td></tr><tr><td>E_instruction</td><td>O</td><td>32</td><td>E_instruction</td></tr><tr><td>E_PC</td><td>O</td><td>32</td><td>E_PC</td></tr></tbody></table></li></ul><h2 id="ID">ID</h2><h3 id="Control">Control</h3><ul><li><p>控制信号表;</p><table><thead><tr><th>控制信号\指令</th><th>add</th><th>sub</th><th>ori</th><th>lw</th><th>sw</th><th>beq</th><th>lui</th><th>jal</th><th>jr</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td></tr><tr><td>aluControlSel</td><td>000</td><td>000</td><td>001</td><td>001</td><td>001</td><td>000</td><td>001</td><td>000</td><td>000</td></tr><tr><td>ALUop</td><td>0000</td><td>0001</td><td>0011</td><td>0000</td><td>0000</td><td>0000</td><td>0100</td><td>0000</td><td>0000</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>RegDst</td><td>000</td><td>000</td><td>001</td><td>001</td><td>000</td><td>000</td><td>001</td><td>011</td><td>000</td></tr><tr><td>WDsel</td><td>00</td><td>00</td><td>00</td><td>01</td><td>00</td><td>00</td><td>00</td><td>10</td><td>00</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>001</td><td>000</td><td>010</td><td>011</td></tr><tr><td>MemWriteDataOp</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td></tr><tr><td>ifB</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>ifJ</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td></tr><tr><td>BranchOp</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td></tr><tr><td>useRt</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>islink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td></tr><tr><td>isConditionalLink</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>isLikely</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr></tbody></table></li><li><p>T模型时间表</p><ul><li><p>    <span id="mjx-2b6730c8">      <style>      #mjx-2b6730c8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="3.92ex" height="1.889ex" role="img" focusable="false" viewBox="0 -677 1732.6 834.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D447" d="M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(572,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mi" transform="translate(1041,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>T</mi><mrow data-mjx-texclass="ORD"><mi>u</mi><mi>s</mi><mi>e</mi></mrow></msub></math></mjx-assistive-mml></mjx-container>    </span>  ：这条指令位于 D 级的时候，再经过多少个时钟周期就必须要使用相应的数据</p></li><li><p>    <span id="mjx-3b1b1e68">      <style>      #mjx-3b1b1e68{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="4.36ex" height="1.889ex" role="img" focusable="false" viewBox="0 -677 1927.1 834.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D447" d="M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(600,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(1066,0)"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>T</mi><mrow data-mjx-texclass="ORD"><mi>n</mi><mi>e</mi><mi>w</mi></mrow></msub></math></mjx-assistive-mml></mjx-container>    </span>  ：位于某个流水级的某个指令，它经过    <span id="mjx-e75e512">      <style>      #mjx-e75e512{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="4.36ex" height="1.889ex" role="img" focusable="false" viewBox="0 -677 1927.1 834.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D447" d="M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(600,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(1066,0)"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>T</mi><mrow data-mjx-texclass="ORD"><mi>n</mi><mi>e</mi><mi>w</mi></mrow></msub></math></mjx-assistive-mml></mjx-container>    </span>  个时钟周期,该指令的结果（即最终要<code>写回 GRF 的值</code>）才会被计算出来，并<code>存入</code>对应的流水级寄存器中，从而可以被后续指令安全使用或转发。</p><ul><li>    <span id="mjx-7de0a17">      <style>      #mjx-7de0a17{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="24.005ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 10610.2 950" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D447" d="M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z"></path></g><g data-mml-node="TeXAtom" transform="translate(617,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(600,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(1066,0)"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z"></path></g></g></g><g data-mml-node="mo" transform="translate(2204.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(3260.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g><g data-mml-node="mo" transform="translate(4038.4,0)"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g><g data-mml-node="mi" transform="translate(5316.2,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">不</text></g><g data-mml-node="mi" transform="translate(6316.2,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">写</text></g><g data-mml-node="mi" transform="translate(7316.2,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">入</text></g><g data-mml-node="mi" transform="translate(8316.2,0)"><path data-c="1D43A" d="M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q492 659 471 656T418 643T357 615T294 567T236 496T189 394T158 260Q156 242 156 221Q156 173 170 136T206 79T256 45T308 28T353 24Q407 24 452 47T514 106Q517 114 529 161T541 214Q541 222 528 224T468 227H431Q425 233 425 235T427 254Q431 267 437 273H454Q494 271 594 271Q634 271 659 271T695 272T707 272Q721 272 721 263Q721 261 719 249Q714 230 709 228Q706 227 694 227Q674 227 653 224Q646 221 643 215T629 164Q620 131 614 108Q589 6 586 3Q584 1 581 1Q571 1 553 21T530 52Q530 53 528 52T522 47Q448 -22 322 -22Q201 -22 126 55T50 252Z"></path></g><g data-mml-node="mi" transform="translate(9102.2,0)"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554Z"></path></g><g data-mml-node="mi" transform="translate(9861.2,0)"><path data-c="1D439" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>T</mi><mrow data-mjx-texclass="ORD"><mi>n</mi><mi>e</mi><mi>w</mi></mrow></msub><mo>=</mo><mn>0</mn><mo stretchy="false">⇒</mo><mi mathvariant="normal">不</mi><mi mathvariant="normal">写</mi><mi mathvariant="normal">入</mi><mi>G</mi><mi>R</mi><mi>F</mi></math></mjx-assistive-mml></mjx-container>    </span>  </li></ul><table><thead><tr><th>指令\T</th><th>RsTuse</th><th>RtTuse</th><th>D_Tnew</th><th>说明</th></tr></thead><tbody><tr><td>R_cal</td><td>1</td><td>1</td><td>2</td><td>Rs、Rt在E级送入ALU，结果在E级产生</td></tr><tr><td>I_cal</td><td>1</td><td>\</td><td>2</td><td>只用Rs，结果在E级产生</td></tr><tr><td>lw(及所有涉及到<code>读内存</code>的指令）</td><td>1</td><td>\</td><td>3</td><td>Rs(base)在E级用于算地址,结果在M级（访存后）产生</td></tr><tr><td>sw</td><td>1</td><td>2</td><td>0</td><td>Rs（地址）在E级，Rt（要写入内存的数据）在M级，无需写回GRF</td></tr><tr><td>j</td><td>\</td><td>\</td><td>0</td><td>不读寄存器、不写寄存器</td></tr><tr><td>jal</td><td>\</td><td>\</td><td>1</td><td>不读寄存器，要写入寄存器的值在D级生成（PC + 4）</td></tr><tr><td>jr</td><td>0</td><td>\</td><td>0</td><td>Rs在D级作为跳转目标被使用，不写寄存器</td></tr><tr><td>beq</td><td>0</td><td>0</td><td>0</td><td>Rs\Rt在D级参与跳转判断；不写入寄存器</td></tr></tbody></table></li></ul></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>opcode</td><td>I</td><td>6</td><td>指令[31:26]位</td></tr><tr><td>funct</td><td>I</td><td>6</td><td>指令[5:0]位</td></tr><tr><td>RegWrite</td><td>O</td><td>1</td><td>GRF写使能信号</td></tr><tr><td>aluControlSel</td><td>O</td><td>3</td><td>alu操作数选择信号<br>000:rs/rt<br>001:rs/imm</td></tr><tr><td>ALUop</td><td>O</td><td>4</td><td>ALU运算模式选择信号</td></tr><tr><td>MemWrite</td><td>O</td><td>1</td><td>DM写使能信号</td></tr><tr><td>MemRead</td><td>O</td><td>1</td><td>DM读使能信号</td></tr><tr><td>EXTop</td><td>O</td><td>1</td><td>EXT扩展模式选择信号</td></tr><tr><td>RegDst</td><td>O</td><td>3</td><td>GRF写回地址选择信号：<br>001:rt<br>000:rd<br>010:rs<br>011:GPR[31]</td></tr><tr><td>WDsel</td><td>O</td><td>2</td><td>GRF写入数据选择信号：<br>00:ALU运算结果<br>01:DM读出的数据（lw）<br>10:PC + 8（延迟槽）</td></tr><tr><td>NPCop</td><td>O</td><td>3</td><td>PC更新模式选择信号:<br>000:顺序执行<br>001:beq分支跳转<br>010:j/jal跳转<BR>011:jr跳转</td></tr><tr><td>MemWriteDataOp</td><td>O</td><td>2</td><td>写入DM数据选择信号<br>00:RtData</td></tr><tr><td>ifB</td><td>O</td><td>1</td><td>是否为B类指令</td></tr><tr><td>ifJ</td><td>O</td><td>1</td><td>是否为J类指令</td></tr><tr><td>BranchOp</td><td>O</td><td>3</td><td><code>判断是否跳转的规则</code>的选择信号<br>3’b000:if(rsData == rtData) 跳转</td></tr><tr><td>useRt</td><td>O</td><td>1</td><td>判断该指令是否涉及到读Rt</td></tr><tr><td>islink</td><td>O</td><td>1</td><td>判断该指令是否要link（<strong>将PC + 8写入<code>$31</code></strong>）</td></tr><tr><td>isConditionalLink</td><td>O</td><td>1</td><td>判断该指令是否是条件link</td></tr><tr><td>isLikely</td><td>O</td><td>1</td><td>判断该指令是否涉及分支清空延迟槽</td></tr></tbody></table></li></ul><h3 id="HCU-冒险控制单元">HCU(冒险控制单元)</h3><ul><li><p>核心任务：(按优先级实现)</p><ol><li>顶层是否空拍一周期？</li><li>是否需要转发？转发路径？</li><li>维持原数据</li></ol></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>D_Rs</td><td>I</td><td>5</td><td>ID中指令对应的Rs地址</td></tr><tr><td>D_Rt</td><td>I</td><td>5</td><td>ID中指令对应的Rt地址</td></tr><tr><td>E_Rs</td><td>I</td><td>5</td><td>EX中指令对应的Rs地址</td></tr><tr><td>E_Rt</td><td>I</td><td>5</td><td>EX中指令对应的Rt地址</td></tr><tr><td>M_Rt</td><td>I</td><td>5</td><td>MEM中指令对应的Rt地址</td></tr><tr><td>E_WA</td><td>I</td><td>5</td><td>“上一条”指令（EX中指令）最终要写入的寄存器地址</td></tr><tr><td>M_WA</td><td>I</td><td>5</td><td>“上上条”指令（MEM中指令）最终要写入的寄存器地址</td></tr><tr><td>W_WA</td><td>I</td><td>5</td><td>（WB中指令）最终要写入的寄存器地址</td></tr><tr><td>E_RegWrite</td><td>I</td><td>1</td><td>EX中指令是否涉及写寄存器</td></tr><tr><td>M_RegWrite</td><td>I</td><td>1</td><td>MEM中指令是否涉及写寄存器</td></tr><tr><td>W_RegWrite</td><td>I</td><td>1</td><td>WB中指令是否涉及写寄存器</td></tr><tr><td>D_useRt</td><td>I</td><td>1</td><td>ID中指令是否涉及到读Rt</td></tr><tr><td>M_ifLink</td><td>I</td><td>1</td><td>M中指令是否要link</td></tr><tr><td>stall</td><td>O</td><td>1</td><td>是否空拍一次</td></tr><tr><td>D_RsData_Sel</td><td>O</td><td>3</td><td>实际写入E_reg\NPC的数据选择信号<br>000：原RsData <br>001：M_ALUresult <br>010:W_WD<br>011:M_PC8<br>100:EPC8<br>tip：必须先判断是否涉及写入<code>$0</code>,再判断001&amp;011，最后判断011（即是否涉及从<strong>最近的一条</strong>在<strong>MEM</strong>的指令跳转）</td></tr><tr><td>D_RtData_Sel</td><td>O</td><td>3</td><td>实际写入E_reg的数据选择信号<br>000：原RtData <br>001：M_ALUresult <br>010:W_WD<br>011:M_PC8<br>100:EPC8</td></tr><tr><td>E_RsData_Sel</td><td>O</td><td>3</td><td>实际写入ALUControl的数据选择信号<br>000：原RsData <br>001：M_ALUresult <br>010: W_WD<br>011: M_PC8<br>100:EPC8</td></tr><tr><td>E_RtData_Sel</td><td>O</td><td>3</td><td>实际写入ALUControl的数据选择信号<br>000：原RtData <br>001：M_ALUresult <br>010: W_WD<br>011: M_PC8<br>100:EPC8</td></tr><tr><td>M_RtData_Sel</td><td>O</td><td>3</td><td>实际写入MemWriteDataSel的数据选择信号<br>000: 原RtData <br>001: W_WD</td></tr></tbody></table></li></ul><h3 id="BranchControl">BranchControl</h3><ul><li>核心任务：判断是否需要跳转</li><li>整体设计：</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>rsData</td><td>I</td><td>32</td><td>rs data</td></tr><tr><td>rtData</td><td>I</td><td>32</td><td>rt data</td></tr><tr><td>ifB</td><td>I</td><td>1</td><td>是否是B类指令</td></tr><tr><td>ifJ</td><td>I</td><td>1</td><td>是否为J类指令</td></tr><tr><td>islink</td><td>I</td><td>1</td><td>判断该指令是否要link（<strong>将PC + 8写入<code>$31</code></strong>）</td></tr><tr><td>isConditionalLink</td><td>I</td><td>1</td><td>判断该指令是否是条件link</td></tr><tr><td>isLikely</td><td>I</td><td>1</td><td>判断该指令是否涉及分支清空延迟槽</td></tr><tr><td>BranchOp</td><td>I</td><td>3</td><td><code>跳转规则</code>的选择信号<br>3’b000:beq</td></tr><tr><td>BranchEn</td><td>O</td><td>1</td><td>是否跳转</td></tr><tr><td>ifLink</td><td>O</td><td>1</td><td>是否真正要link</td></tr><tr><td>D_flush</td><td>O</td><td>1</td><td>是否清空延迟槽</td></tr></tbody></table></li></ul><h3 id="NPC">NPC</h3><ul><li><p>核心任务计算下一周期PC应更新成的值</p></li><li><p>整体设计<mark>所有分支/跳转目标地址必须基于 D_PC</mark></p><ul><li>顺序执行： <code>NPC = PC + 4</code></li><li>分支跳转：<code>NPC = (PC + 4) + (SignExtend(offset))</code></li><li>j跳转：<code>NPC = (PC + 4)31...28||instr_index||00</code></li><li>jr跳转：<code>NPC = GPR[rs]</code></li></ul></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>immEXT</td><td>I</td><td>32</td><td>拓展后的立即数（offset）</td></tr><tr><td>instr_index</td><td>I</td><td>26</td><td>instr_index</td></tr><tr><td>NPCop</td><td>I</td><td>3</td><td>000:NPC = PC + 4<br>001:分支跳转<br>010:j<br>011:jr</td></tr><tr><td>rd1OrRs</td><td>I</td><td>32</td><td>rs储存的值</td></tr><tr><td>BranchEn</td><td>I</td><td>1</td><td><code>B</code>型指令是否跳转</td></tr><tr><td>F_PC</td><td>I</td><td>32</td><td>刚进入流水线（IF阶段取出）的指令地址</td></tr><tr><td>D_PC</td><td>I</td><td>32</td><td>D_PC</td></tr><tr><td>NPC</td><td>O</td><td>32</td><td>IFU中PC更新值</td></tr></tbody></table></li></ul><h3 id="GRF">GRF</h3><ul><li>整体设计<ul><li>读数据：指令最多需要同时读取<code>两个</code>不同地址的数据 - <code>两个读端口</code></li><li>写数据</li><li><blockquote><p>0 号寄存器的值始终保持为 0。其他寄存器初始值（复位后）均为 0，无需专门设置</p></blockquote></li></ul></li><li>模块规格：<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>RA1</td><td>I</td><td>5</td><td>读地址1</td></tr><tr><td>RA2</td><td>I</td><td>5</td><td>读地址2</td></tr><tr><td>WA</td><td>I</td><td>5</td><td>写地址</td></tr><tr><td>WD</td><td>I</td><td>32</td><td>写数据</td></tr><tr><td>RegWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>RD1</td><td>O</td><td>32</td><td>读数据1</td></tr><tr><td>RD2</td><td>O</td><td>32</td><td>读数据2</td></tr></tbody></table></li></ul><h3 id="WASel">WASel</h3><ul><li>整体设计选择存入GRF的地址</li><li>模块规格：<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>RegDst</td><td>I</td><td>3</td><td>GRF写回地址选择信号：<br>001:rt<br>000:rd<br>010:rs<br>011:GPR[31]</td></tr><tr><td>rs</td><td>I</td><td>5</td><td>rs</td></tr><tr><td>rt</td><td>I</td><td>5</td><td>rt</td></tr><tr><td>rd</td><td>I</td><td>5</td><td>rd</td></tr></tbody></table></li></ul><h3 id="EXT">EXT</h3><ul><li>核心任务把16位立即数扩展到32位</li><li>整体设计能够对立即数进行<code>零扩展/符号扩展</code></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>immOrOffset</td><td>I</td><td>16</td><td>待扩展的立即数</td></tr><tr><td>EXTop</td><td>I</td><td>1</td><td>扩展方式选择信号：<br>1 - 符号扩展 <br>0 - 零扩展</td></tr><tr><td>immEXT</td><td>O</td><td>32</td><td>扩展后的立即数</td></tr></tbody></table></li></ul><h2 id="E">E</h2><h3 id="Reg-E">Reg_E</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>clk</td><td>I</td><td>1</td><td>clock</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>stall</td><td>I</td><td>1</td><td>清零信号</td></tr><tr><td>D_ControlBus</td><td>I</td><td><code>CTL_BUS_WIDTH</code></td><td>D_ControlBus</td></tr><tr><td>D_instruction</td><td>I</td><td>32</td><td>D_instruction</td></tr><tr><td>D_RD1</td><td>I</td><td>32</td><td>D_RD1</td></tr><tr><td>D_RD2</td><td>I</td><td>32</td><td>D_RD2</td></tr><tr><td>D_immEXT</td><td>I</td><td>32</td><td>D_immEXT</td></tr><tr><td>D_PC</td><td>I</td><td>32</td><td>D_PC</td></tr><tr><td>D_WA</td><td>I</td><td>5</td><td>D_WA</td></tr><tr><td>D_ifLink</td><td>I</td><td>1</td><td>D_ifLink</td></tr><tr><td>E_ControlBus</td><td>O</td><td><code>CTL_BUS_WIDTH</code></td><td>E_ControlBus</td></tr><tr><td>E_instruction</td><td>O</td><td>32</td><td>E_instruction</td></tr><tr><td>E_RD1</td><td>O</td><td>32</td><td>E_RD1</td></tr><tr><td>E_RD2</td><td>O</td><td>32</td><td>E_RD2</td></tr><tr><td>E_immEXT</td><td>O</td><td>32</td><td>E_immEXT</td></tr><tr><td>E_PC</td><td>O</td><td>32</td><td>E_PC</td></tr><tr><td>E_WA</td><td>O</td><td>5</td><td>E_WA</td></tr><tr><td>E_ifLink</td><td>O</td><td>1</td><td>E_ifLInk</td></tr></tbody></table></li></ul><h2 id="EX">EX</h2><h3 id="ALUControl">ALUControl</h3><ul><li>整体设计为alu选择operand1，operand2</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>RsData</td><td>I</td><td>32</td><td>RsData</td></tr><tr><td>RtData</td><td>I</td><td>32</td><td>RtData</td></tr><tr><td>immEXT</td><td>I</td><td>32</td><td>扩展后的立即数</td></tr><tr><td>shamt</td><td>I</td><td>5</td><td>shamt</td></tr><tr><td>aluControlSel</td><td>I</td><td>3</td><td>选择信号<br>000:rs/rt<br>001:rs/imm</td></tr><tr><td>operand1</td><td>O</td><td>32</td><td>operand1</td></tr><tr><td>operand2</td><td>O</td><td>32</td><td>operand2</td></tr></tbody></table></li></ul><h3 id="ALU">ALU</h3><ul><li>整体设计<ul><li>能够实现多种运算功能，并根据ALUop选择对应功能<table><thead><tr><th>ALUop</th><th>运算</th></tr></thead><tbody><tr><td>0000</td><td>无符号<code>op1 + op2</code></td></tr><tr><td>0001</td><td>无符号<code>op1 - op2</code></td></tr><tr><td>0010</td><td><code>op1 &amp; op2</code></td></tr><tr><td>0011</td><td><code>op1 | op2</code></td></tr><tr><td>0100</td><td>op2低16位加载至高位，低位补0</td></tr><tr><td>0101</td><td><code>$signed(operand1)&lt;$signed(operand2) ? 1:0</code></td></tr></tbody></table></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>ALUop</td><td>I</td><td>4</td><td>选择运算功能</td></tr><tr><td>operand1</td><td>I</td><td>32</td><td>operand1</td></tr><tr><td>operand2</td><td>I</td><td>32</td><td>operand2</td></tr><tr><td>ALUresult</td><td>O</td><td>32</td><td>运算结果</td></tr></tbody></table></li></ul><h2 id="M">M</h2><h3 id="Reg-M">Reg_M</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>clk</td><td>I</td><td>1</td><td>clock</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>E_ControlBus</td><td>I</td><td><code>CTL_BUS_WIDTH+1</code></td><td>来自 E 级的控制信号</td></tr><tr><td>E_instruction</td><td>I</td><td>32</td><td>E_instruction</td></tr><tr><td>E_ALUresult</td><td>I</td><td>32</td><td>E_ALUresult</td></tr><tr><td>E_RD1</td><td>I</td><td>32</td><td>E_RD1</td></tr><tr><td>E_RD2</td><td>I</td><td>32</td><td>E_RD2</td></tr><tr><td>E_immEXT</td><td>I</td><td>32</td><td>E_immEXT</td></tr><tr><td>E_MemWriteData</td><td>I</td><td>32</td><td>E_MemWriteData</td></tr><tr><td>E_PC</td><td>I</td><td>32</td><td>E_PC</td></tr><tr><td>E_WA</td><td>I</td><td>5</td><td>E_WA</td></tr><tr><td>E_ifLink</td><td>I</td><td>1</td><td>E_ifLInk</td></tr><tr><td>M_ControlBus</td><td>O</td><td><code>CTL_BUS_WIDTH+1</code></td><td>M_ControlBus</td></tr><tr><td>M_instruction</td><td>O</td><td>32</td><td>M_instruction</td></tr><tr><td>M_ALUresult</td><td>O</td><td>32</td><td>M_ALUresult</td></tr><tr><td>M_RD1</td><td>O</td><td>32</td><td>M_RD1</td></tr><tr><td>M_RD2</td><td>O</td><td>32</td><td>M_RD2</td></tr><tr><td>M_immEXT</td><td>O</td><td>32</td><td>M_immEXT</td></tr><tr><td>M_MemWriteData</td><td>O</td><td>32</td><td>M_MemWriteData</td></tr><tr><td>M_PC</td><td>O</td><td>32</td><td>M_PC</td></tr><tr><td>M_WA</td><td>O</td><td>5</td><td>M_WA</td></tr><tr><td>M_ifLink</td><td>O</td><td>1</td><td>M_ifLInk</td></tr></tbody></table></li></ul><h2 id="MEM">MEM</h2><h3 id="MemWriteDataSel">MemWriteDataSel</h3><ul><li>整体设计选择写入内存的数据</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>MemWriteDataOp</td><td>I</td><td>2</td><td>写入DM数据选择信号<br>00:RtData</td></tr><tr><td>RtData</td><td>I</td><td>32</td><td>rt data</td></tr><tr><td>MemWriteData</td><td>O</td><td>32</td><td>写入DM的数据</td></tr></tbody></table></li></ul><h3 id="DM">DM</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>Address</td><td>I</td><td>32</td><td>读/写地址，<mark><strong>默认是ALUresult</strong></mark></td></tr><tr><td>WriteData</td><td>I</td><td>32</td><td>要写入的数据</td></tr><tr><td>MemWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>MemRead</td><td>I</td><td>1</td><td>读使能信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>PC</td><td>I</td><td>32</td><td>当前指令的地址</td></tr><tr><td>LoadType</td><td>I</td><td>2</td><td>load模式选择信号<br>2’b00:lw<br>2’b01:lh</td></tr><tr><td>SaveType</td><td>I</td><td>2</td><td>Save模式选择信号<br>2’b00:sw<br>2’b01:sh</td></tr><tr><td>MemReadData</td><td>O</td><td>32</td><td>读出的数据</td></tr></tbody></table></li></ul><h2 id="W">W</h2><h3 id="Reg-W">Reg_W</h3><ul><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>clk</td><td>I</td><td>1</td><td>clock</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>M_ControlBus</td><td>I</td><td><code>CTL_BUS_WIDTH+1</code></td><td>来自 M 级的控制信号</td></tr><tr><td>M_instruction</td><td>I</td><td>32</td><td>M_instruction</td></tr><tr><td>M_ALUresult</td><td>I</td><td>32</td><td>M_ALUresult</td></tr><tr><td>M_RD1</td><td>I</td><td>32</td><td>M_RD1</td></tr><tr><td>M_RD2</td><td>I</td><td>32</td><td>M_RD2</td></tr><tr><td>M_immEXT</td><td>I</td><td>32</td><td>M_immEXT</td></tr><tr><td>M_MemReadData</td><td>I</td><td>32</td><td>M_MemReadData</td></tr><tr><td>M_PC</td><td>I</td><td>32</td><td>M_PC</td></tr><tr><td>M_WA</td><td>I</td><td>5</td><td>M_WA</td></tr><tr><td>M_ifLink</td><td>I</td><td>1</td><td>M_ifLInk</td></tr><tr><td>W_ControlBus</td><td>O</td><td><code>CTL_BUS_WIDTH+1</code></td><td>W_ControlBus</td></tr><tr><td>W_instruction</td><td>O</td><td>32</td><td>W_instruction</td></tr><tr><td>W_ALUresult</td><td>O</td><td>32</td><td>W_ALUresult</td></tr><tr><td>W_RD1</td><td>O</td><td>32</td><td>W_RD1</td></tr><tr><td>W_RD2</td><td>O</td><td>32</td><td>W_RD2</td></tr><tr><td>W_immEXT</td><td>O</td><td>32</td><td>W_immEXT</td></tr><tr><td>W_MemReadData</td><td>O</td><td>32</td><td>W_MemReadData</td></tr><tr><td>W_PC</td><td>O</td><td>32</td><td>W_PC</td></tr><tr><td>W_WA</td><td>O</td><td>5</td><td>W_WA</td></tr><tr><td>W_ifLink</td><td>O</td><td>1</td><td>W_ifLInk</td></tr></tbody></table></li></ul><h2 id="WB">WB</h2><h3 id="WDSel">WDSel</h3><ul><li>整体思路选择写回GRF的数据</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>WDsel</td><td>I</td><td>2</td><td>GRF写入数据选择信号：<br>00:ALU运算结果<br>01:DM读出的数据（lw）<br>10:PC + 8（延迟槽）</td></tr><tr><td>ALUresult</td><td>I</td><td>32</td><td>ALU运算结果</td></tr><tr><td>MemData</td><td>I</td><td>32</td><td>DM读出的数据</td></tr><tr><td>PC</td><td>I</td><td>32</td><td>PC</td></tr><tr><td>WD</td><td>O</td><td>32</td><td>WD</td></tr></tbody></table></li></ul><h1 id="测试">测试</h1><h2 id="测试覆盖">测试覆盖</h2><ol><li>基本指令功能</li><li>转发测试</li><li>暂停测试</li></ol><h2 id="基本指令功能测试">基本指令功能测试</h2><p>略</p><h2 id="转发测试">转发测试</h2><p>按照完备性表格分类测试</p><table><thead><tr><th>转发到/数据来源</th><th>M锁存的ALUresult</th><th>W_WD</th><th>M_PC8</th></tr></thead><tbody><tr><td>ID stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td></tr><tr><td>EX stage</td><td>RtData/RsData</td><td>RtData/RsData</td><td>RtData/RsData</td></tr><tr><td>MEM stage</td><td>不存在</td><td>RtData</td><td>不存在</td></tr></tbody></table><ul><li><p>（1，1）：ID ← M_ALUresult</p><figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ori </span>$<span class="number">3</span>, $<span class="number">0</span>, <span class="number">1</span></span><br><span class="line"><span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">0</span>, <span class="number">2</span></span><br><span class="line"><span class="keyword">beq </span>$<span class="number">5</span>, $<span class="number">3</span>, label </span><br><span class="line"><span class="symbol">label:</span></span><br><span class="line"><span class="keyword">nop</span></span><br></pre></td></tr></table></figure></li><li><p>（1，2）：ID ← W_WD</p><figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line">  <span class="keyword">ori </span>$<span class="number">3</span>, $<span class="number">0</span>, <span class="number">1</span></span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">0</span>, <span class="number">2</span></span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">6</span>, $<span class="number">0</span>, <span class="number">2</span></span><br><span class="line">  <span class="keyword">beq </span>$<span class="number">5</span>, $<span class="number">3</span>, label </span><br><span class="line"><span class="symbol">  label:</span></span><br><span class="line">  <span class="keyword">nop</span></span><br><span class="line"><span class="keyword"></span>  ```  </span><br><span class="line">- （<span class="number">1</span>，<span class="number">3</span>）：ID ← M_PC + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">jal </span>return</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">0</span>, <span class="number">2</span></span><br><span class="line">  <span class="keyword">beq </span>$<span class="number">5</span>, $<span class="number">31</span>, label </span><br><span class="line"><span class="symbol">  return:</span></span><br><span class="line">  <span class="keyword">jr </span>$<span class="number">31</span></span><br><span class="line"><span class="symbol">  label:</span></span><br><span class="line">  <span class="keyword">nop</span></span><br><span class="line"><span class="keyword"></span>  ```  </span><br><span class="line">- （<span class="number">2</span>，<span class="number">1</span>）：EX ← M_ALUresult</span><br><span class="line"></span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">3</span>, $<span class="number">0</span>, <span class="number">1</span></span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">3</span>, <span class="number">2</span></span><br><span class="line">  ```  </span><br><span class="line">- （<span class="number">2</span>，<span class="number">2</span>）：EX ← W_WD</span><br><span class="line"></span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">3</span>, $<span class="number">0</span>, <span class="number">1</span></span><br><span class="line">  <span class="keyword">add </span>$<span class="number">5</span>, $<span class="number">3</span>, $<span class="number">3</span></span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">3</span>, <span class="number">2</span></span><br><span class="line">  ```  </span><br><span class="line">- （<span class="number">2</span>，<span class="number">3</span>）：EX ← M_PC + <span class="number">8</span></span><br><span class="line"></span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">jal </span>return</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">4</span>, $<span class="number">31</span>, <span class="number">2</span></span><br><span class="line"><span class="symbol">  return:</span></span><br><span class="line">  <span class="keyword">jr </span>$<span class="number">31</span></span><br><span class="line"><span class="symbol">  label:</span></span><br><span class="line">  <span class="keyword">nop</span></span><br><span class="line"><span class="keyword"></span>  ```  </span><br><span class="line"></span><br><span class="line">  </span><br><span class="line">- （<span class="number">3</span>，<span class="number">2</span>）：MEM ← W_WD</span><br><span class="line"></span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">3</span>, $<span class="number">0</span>, <span class="number">5</span>   </span><br><span class="line">  <span class="keyword">sw </span> $<span class="number">3</span>, <span class="number">0</span>($<span class="number">0</span>)   </span><br><span class="line">  ```  </span><br><span class="line"></span><br><span class="line"><span class="comment">## 暂停测试</span></span><br><span class="line">- E_Conflict：</span><br><span class="line">  ```mips</span><br><span class="line">  <span class="keyword">ori </span>$<span class="number">1</span>,$<span class="number">0</span>,<span class="number">3</span></span><br><span class="line">  <span class="keyword">beq </span>$<span class="number">1</span>,$<span class="number">0</span>,label</span><br><span class="line"><span class="symbol">  label:</span></span><br><span class="line">  <span class="keyword">nop</span></span><br></pre></td></tr></table></figure></li><li><p>M_Conflict：</p><figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">lw </span>$<span class="number">1</span>, <span class="number">0</span>($<span class="number">0</span>)      </span><br><span class="line"><span class="keyword">nop </span>                </span><br><span class="line"><span class="keyword">beq </span>$<span class="number">1</span>, $<span class="number">0</span>, label  </span><br><span class="line"><span class="symbol">label:</span></span><br><span class="line"><span class="keyword">nop</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="测试出来的问题">测试出来的问题</h1><h2 id="link类">link类</h2><ul><li>问题<ul><li>我默认传递的PC值不会被覆盖，所以在WB阶段直接写入W_PC + 4。但实际上由于stall、D_flush的存在，PC值在中间是可能被覆盖的。<ul><li>所以为了保证link的正确性，我们应该额外设置数据通路，将实际要写回的<code>D_PC + 4</code>往后传。</li></ul></li></ul></li></ul><h2 id="What-is-FLUSH-？">What is FLUSH ？</h2><ul><li>D_flush（likely导致的）：在D级注入一条nop（本质：<mark>REPLACEMENT</mark>）<ul><li>清空instruction</li><li>PC保持原值</li></ul></li><li>E_flush(stall导致的)：在E级注入一条nop（本质：<mark>INSERTION</mark>）<ul><li>清空instruction</li><li>PC保持原值（该nop是凭空加在两条指令之间的，没有对应的PC）</li></ul></li></ul><h1 id="思考题">思考题</h1><ol><li><p>我们使用提前分支判断的方法尽早产生结果来减少因不确定而带来的开销，但实际上这种方法并非总能提高效率，请从流水线冒险的角度思考其原因并给出一个指令序列的例子。</p><ul><li>原因：提前判断需要RsData和RtData，而这两个数据可能需要转发。如果HCU判断需要stall，那么提前判断节省的一个T和stall延迟的一个T就抵消了，并没有提高效率。</li><li>例如：  <figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">lw </span>  $<span class="built_in">t0</span>, <span class="number">0</span>($<span class="built_in">t1</span>)    </span><br><span class="line"><span class="keyword">beq </span> $<span class="built_in">t0</span>, $<span class="built_in">zero</span>, L  </span><br></pre></td></tr></table></figure></li></ul></li><li><p>因为延迟槽的存在，对于 jal 等需要将指令地址写入寄存器的指令，要写回 PC + 8，请思考为什么这样设计？</p><ul><li>jal把下一条“应该执行”的指令地址写入<code>$ra</code>（<code>$31</code>）,但由于延迟槽的存在，下一条要执行的指令实际上是<code>PC + 8</code>处的（<strong>下下条</strong>）指令。</li></ul></li><li><p>我们要求大家所有转发数据都来源于流水寄存器而不能是功能部件（如 DM 、 ALU ），请思考为什么？</p><ul><li>功能部件在同一周期内输出还不稳定，但来自流水寄存器的数据已经进行过一次锁存，是稳定的数据</li><li>运用其它阶段正在计算的中间值本质上破坏了流水线的时序结构，相当于又类似单周期CPU一样形成了横跨各阶段的巨大组合逻辑</li></ul></li><li><p>我们为什么要使用 GPR 内部转发？该如何实现？</p><ul><li>内部转发本质：当GRF同时在WB被写入，在ID被读出，且存在读写寄存器冲突，读出的寄存器值应为新写入的值</li><li>如果不实现内部转发，就会引发<code>同周期</code>的WD-ID数据冒险</li><li>实现：   <figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">assign</span> RD1 = (RA1 != <span class="number">0</span> &amp;&amp; RA1 == WA &amp;&amp; RegWrite) ? WD : register[RA1];</span><br><span class="line"><span class="keyword">assign</span> RD2 = (RA2 != <span class="number">0</span> &amp;&amp; RA2 == WA &amp;&amp; RegWrite) ? WD : register[RA2];</span><br></pre></td></tr></table></figure></li></ul></li><li><p>我们转发时数据的需求者和供给者可能来源于哪些位置？共有哪些转发数据通路？需求者\供给者|M锁存的ALUresult|W_WD|M_PC8|E_PC8—|—|—|—ID stage：|RtData/RsData|RtData/RsData|RtData/RsData|RtData/RsDataEX stage：|RtData/RsData|RtData/RsData|RtData/RsData|不存在MEM stage：|不存在|RtData|不存在|不存在</p></li><li><p>在课上测试时，我们需要你现场实现新的指令，对于这些新的指令，你可能需要在原有的数据通路上做哪些扩展或修改？提示：你可以对指令进行分类，思考每一类指令可能修改或扩展哪些位置。</p><ul><li>对指令进行分类<ul><li>R_cal</li><li>I_cal</li><li>B</li><li>J<ul><li>B&amp;J可能有以下属性<ul><li>Link</li><li>Likely</li><li>ConditionalLink</li></ul></li></ul></li><li>Load：所有涉及到读dm的指令</li><li>Save</li></ul></li><li>具体见上“加指令思路”</li></ul></li><li><p>确定你的译码方式，简要描述你的译码器架构，并思考该架构的优势以及不足。</p><ul><li>选择集中式译码 &amp; 控制信号驱动型译码</li><li>优势：<ul><li>集中式译码：只用设置一个Control单元，译码之后把ControlBus一直往后传即可</li><li>控制信号驱动型译码：代码简洁，拓展性好</li></ul></li><li>不足：<ul><li>集中式译码：ControlBus位宽大（即数据通路过宽）</li></ul></li></ul></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;要求&quot;&gt;要求&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;全力转发！&lt;/li&gt;
&lt;li&gt;支持指令集：{add,sub,ori,lui,lw,sw,beq,jr,jal,nop}&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;需要重构的地方&quot;&gt;需要重构的地方&lt;/h1&gt;
&lt;h2 id=&quot;译码</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-CO-P4 基于verilog的单周期MIPS架构CPU</title>
    <link href="https://crazyinloo.github.io/2025/11/17/CO-P4/"/>
    <id>https://crazyinloo.github.io/2025/11/17/CO-P4/</id>
    <published>2025-11-17T14:05:02.000Z</published>
    <updated>2025-11-24T13:34:03.985Z</updated>
    
    <content type="html"><![CDATA[<h1 id="改动">改动</h1><p>相比P3，需要增加的：</p><ol><li>自行实现ROM、RAM</li><li>实例化&amp;端口映射</li><li>改为同步复位</li><li>用initial对reg赋初值</li><li>对P3中集成alu进行拆分：增加<code>aluControl</code>来进行operand1、operand2的选择</li><li>对grf的修改<ul><li>现在默认RA1接rs，RA2接rt</li><li>若需读取二者以外的寄存器，可临时为grf添加<code>RA3</code>、<code>RD3</code>，为<code>aluControl</code>添加<code>rd3</code></li></ul></li><li>DM添加LoadType\SaveType,为lh、sh、lb、sb等指令的添加预留可扩展性</li></ol><h1 id="注意项">注意项</h1><ol><li>case语句要写default</li><li>用综合的check syntax检查</li><li>verilog默认数字为<code>十进制32位数</code>:除了明确十进制数，一定带上格式</li><li>避免任何可能产生锁存器的地方</li><li>缩减异或：对于一个 n 位的向量 <code>A[n-1:0]</code>，表达式 <code>^A</code> 在逻辑上等价于：<code>A[n-1] ^ A[n-2] ^ ... ^ A[1] ^ A[0]</code></li><li>到底是要用<code>rs</code>还是<code>RsData</code>？<ul><li>需要在命名和顶层连线时注意区分。</li></ul></li></ol><h1 id="实例化">实例化</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// 格式: module_name instance_name ( .port_name(wire_name), ... );</span><br><span class="line">control ctrl_unit (</span><br><span class="line">    .opcode(opcode),</span><br><span class="line">    .reg_write(reg_write),</span><br><span class="line">    .mem_to_reg(mem_to_reg)</span><br><span class="line">    // ... connect other ports</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h1 id="可拓展">可拓展</h1><ol><li>dm相关<ul><li>可增加<code>dmSel</code>模块来模拟MUX对写入dm的地址和数据进行选择</li><li>lb/sb的实现</li></ul></li></ol><h1 id="层次设计">层次设计</h1><h2 id="EXT（扩展单元）">EXT（扩展单元）</h2><ul><li>核心任务把16位立即数扩展到32位</li><li>整体设计能够对立即数进行<code>零扩展/符号扩展</code></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>immOrOffset</td><td>I</td><td>16</td><td>待扩展的立即数</td></tr><tr><td>EXTop</td><td>I</td><td>1</td><td>扩展方式选择信号：<br>1 - 符号扩展 <br>0 - 零扩展</td></tr><tr><td>immEXT</td><td>O</td><td>32</td><td>扩展后的立即数</td></tr></tbody></table></li></ul><h2 id="aluControl">aluControl</h2><ul><li>整体设计为alu选择operand1，operand2</li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>rs</td><td>I</td><td>32</td><td>rs value</td></tr><tr><td>rt</td><td>I</td><td>32</td><td>rt value</td></tr><tr><td>immEXT</td><td>I</td><td>32</td><td>扩展后的立即数</td></tr><tr><td>shamt</td><td>I</td><td>5</td><td>shamt</td></tr><tr><td>aluControlSel</td><td>I</td><td>3</td><td>选择信号<br>000:rs/rt<br>001:rs/imm</td></tr><tr><td>operand1</td><td>O</td><td>32</td><td>operand1</td></tr><tr><td>operand2</td><td>O</td><td>32</td><td>operand2</td></tr></tbody></table></li></ul><h2 id="ALU">ALU</h2><ul><li>整体设计<ul><li>能够实现多种运算功能，并根据op选择对应功能<table><thead><tr><th>op</th><th>运算</th></tr></thead><tbody><tr><td>0000</td><td>无符号<code>op1 + op2</code></td></tr><tr><td>0001</td><td>无符号<code>op1 - op2</code></td></tr><tr><td>0010</td><td><code>op1 &amp; op2</code></td></tr><tr><td>0011</td><td><code>op1 | op2</code></td></tr><tr><td>0100</td><td>op2低16位加载至高位，低位补0</td></tr></tbody></table></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>op</td><td>I</td><td>4</td><td>选择运算功能</td></tr><tr><td>operand1</td><td>I</td><td>32</td><td>operand1</td></tr><tr><td>operand2</td><td>I</td><td>32</td><td>operand2</td></tr><tr><td>result</td><td>O</td><td>32</td><td>运算结果</td></tr><tr><td>equal</td><td>O</td><td>1</td><td>判断是否相等</td></tr></tbody></table></li></ul><h2 id="NPC">NPC</h2><ul><li><p>核心任务计算下一周期PC应更新成的值</p></li><li><p>整体设计- 顺序执行： <code>NPC = PC + 4</code>- 分支跳转：<code>NPC = (PC + 4) + (SignExtend(offset))</code>- j跳转：NPC = PC31…28||instr_index||00- jr跳转：NPC = GPR[rs]</p></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>equal</td><td>I</td><td>1</td><td>判断reg rs、rt所存值是否相同</td></tr><tr><td>immEXT</td><td>I</td><td>32</td><td>拓展后的立即数（offset）</td></tr><tr><td>instr_index</td><td>I</td><td>26</td><td>instr_index</td></tr><tr><td>NPCop</td><td>I</td><td>3</td><td>000:NPC = PC + 4<br>001:分支跳转<br>010:j<br>011:jr</td></tr><tr><td>rd1OrRs</td><td>I</td><td>32</td><td>rs储存的值</td></tr><tr><td>pc</td><td>I</td><td>32</td><td>当前指令地址</td></tr><tr><td>npc</td><td>O</td><td>32</td><td>pc更新值</td></tr></tbody></table></li></ul><h2 id="IFU">IFU</h2><ul><li>核心任务：根据PC中的地址，从ROM中读出指令输出，同时更新PC</li><li>整体设计<ul><li><p><strong>地址转换逻辑</strong>：</p><ul><li>地址偏移：pc - 0x00003000</li><li>将PC的字节地址转换为ROM的字地址</li></ul></li><li><p>ROM：用1024个[31:0]reg来构建ROM</p></li><li><p>载入数据？</p>  <figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">initial</span> <span class="keyword">begin</span></span><br><span class="line">    <span class="built_in">$readmemh</span>(<span class="string">&quot;code.txt&quot;</span>, imem);</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>同步复位信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>npc</td><td>I</td><td>32</td><td>pc更新值</td></tr><tr><td>Instruction</td><td>O</td><td>32</td><td>指令机器码</td></tr><tr><td>pc</td><td>O</td><td>32</td><td>当前pc</td></tr></tbody></table></li></ul><h2 id="GRF（通用寄存器组）">GRF（通用寄存器组）</h2><ul><li><p>核心任务：为ALU提供快速的数据源，并接收计算结果</p></li><li><p>整体设计</p><ul><li>读数据：指令最多需要同时读取<code>两个</code>不同地址的数据 - <code>两个读端口</code></li><li>写数据</li><li><blockquote><p>0 号寄存器的值始终保持为 0。其他寄存器初始值（复位后）均为 0，无需专门设置</p></blockquote></li></ul></li><li><p>模块规格：</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>RA1</td><td>I</td><td>5</td><td>读地址1</td></tr><tr><td>RA2</td><td>I</td><td>5</td><td>读地址2</td></tr><tr><td>WA</td><td>I</td><td>5</td><td>写地址</td></tr><tr><td>WD</td><td>I</td><td>32</td><td>写数据</td></tr><tr><td>RegWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>RD1</td><td>O</td><td>32</td><td>读数据1</td></tr><tr><td>RD2</td><td>O</td><td>32</td><td>读数据2</td></tr></tbody></table><p>注：这里的“地址”指的是GRF中的第n个reg</p></li></ul><h2 id="DM（数据存储器）">DM（数据存储器）</h2><ul><li>核心任务根据 <code>CPU</code> 提供的地址，进行<code>读或写操作</code>。它连接了 CPU 的核心与外部数据存储。</li><li>整体设计<ul><li><p>使用 <code>RAM</code> 实现，容量为 <code>3072 × 32bit</code>，应具有异步复位功能，<strong>复位值</strong>为 <code>0x00000000</code>。</p></li><li><p><strong>起始地址</strong>：<code>0x00000000</code>。<strong>地址范围</strong>：<code>0x00000000 ~ 0x00002FFF</code>。</p></li><li><p>RAM 应使用<code>双端口模式</code>，即设置 RAM 的 <code>Data Interface</code> 属性为 <code>Separate load and store ports</code>。</p></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>Address</td><td>I</td><td>32</td><td>读/写地址</td></tr><tr><td>WriteData</td><td>I</td><td>32</td><td>要写入的数据</td></tr><tr><td>MemWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>MemRead</td><td>I</td><td>1</td><td>读使能信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>PC</td><td>I</td><td>32</td><td>当前指令的地址</td></tr><tr><td>LoadType</td><td>I</td><td>2</td><td>load模式选择信号<br>2’b00:lw<br>2’b01:lh</td></tr><tr><td>SaveType</td><td>I</td><td>2</td><td>Save模式选择信号<br>2’b00:sw<br>2’b01:sh</td></tr><tr><td>MemData</td><td>O</td><td>32</td><td>读出的数据</td></tr></tbody></table></li></ul><h2 id="grfSel">grfSel</h2><ul><li>核心任务决定写入grf的地址和数据</li><li>模块设计<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>RegDst</td><td>I</td><td>3</td><td>GRF写回地址选择信号：<br>001:rt<br>000:rd<br>010:rs<br>011:GPR[31]</td></tr><tr><td>WDsel</td><td>I</td><td>2</td><td>GRF写入数据选择信号：<br>00:ALU运算结果<br>01:DM读出的数据（lw）<br>10:PC + 4</td></tr><tr><td>rs</td><td>I</td><td>5</td><td>rs</td></tr><tr><td>rt</td><td>I</td><td>5</td><td>rt</td></tr><tr><td>rd</td><td>I</td><td>5</td><td>rd</td></tr><tr><td>ALUresult</td><td>I</td><td>32</td><td>ALU运算结果</td></tr><tr><td>MemData</td><td>I</td><td>32</td><td>DM读出的数据</td></tr><tr><td>PC</td><td>I</td><td>32</td><td>PC</td></tr><tr><td>WA</td><td>O</td><td>5</td><td>WA</td></tr><tr><td>WD</td><td>O</td><td>32</td><td>WD</td></tr></tbody></table></li></ul><h2 id="instrSplitter">instrSplitter</h2><ul><li>核心任务对指令机器码进行拆分</li><li>模块设计<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>Instruction</td><td>I</td><td>32</td><td>指令</td></tr><tr><td>opcode</td><td>O</td><td>6</td><td>instr[31:26]</td></tr><tr><td>rs</td><td>O</td><td>5</td><td>instr[25:21]</td></tr><tr><td>rt</td><td>O</td><td>5</td><td>instr[20:16]</td></tr><tr><td>rd</td><td>O</td><td>5</td><td>instr[15:11]</td></tr><tr><td>shamt</td><td>O</td><td>5</td><td>instr[10:6]</td></tr><tr><td>funct</td><td>O</td><td>6</td><td>instr[5:0]</td></tr><tr><td>instr_index</td><td>I</td><td>26</td><td>instr[25:0]</td></tr><tr><td>immOrOffset</td><td>I</td><td>16</td><td>instr[15:0]</td></tr></tbody></table></li></ul><h2 id="Controller">Controller</h2><ul><li><p>核心任务：根据当前正在执行的<code>指令</code>输出对应控制信号</p></li><li><p>整体设计解码逻辑 = 和逻辑 + 或逻辑</p><ul><li><p>和逻辑：<strong>识别</strong></p><ul><li>将输入的机器码识别为相应指令</li></ul></li><li><p>或逻辑：<strong>生成</strong></p><ul><li>根据输入指令生成对应的控制信号</li><li>控制信号表;<table><thead><tr><th>控制信号\指令</th><th>add</th><th>sub</th><th>ori</th><th>lw</th><th>sw</th><th>beq</th><th>lui</th><th>jal</th><th>jr</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td></tr><tr><td>aluControlSel</td><td>000</td><td>000</td><td>001</td><td>001</td><td>001</td><td>000</td><td>001</td><td>000</td><td>000</td></tr><tr><td>ALUop</td><td>0000</td><td>0001</td><td>0011</td><td>0000</td><td>0000</td><td>0000</td><td>0100</td><td>0000</td><td>0000</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td></tr><tr><td>RegDst</td><td>000</td><td>000</td><td>001</td><td>001</td><td>000</td><td>000</td><td>001</td><td>011</td><td>000</td></tr><tr><td>WDsel</td><td>00</td><td>00</td><td>00</td><td>01</td><td>00</td><td>00</td><td>00</td><td>10</td><td>00</td></tr><tr><td>NPCop</td><td>000</td><td>000</td><td>000</td><td>000</td><td>000</td><td>001</td><td>000</td><td>010</td><td>011</td></tr></tbody></table></li></ul></li></ul></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>opcode</td><td>I</td><td>6</td><td>指令[31:26]位</td></tr><tr><td>funct</td><td>I</td><td>6</td><td>指令[5:0]位</td></tr><tr><td>RegWrite</td><td>O</td><td>1</td><td>GRF写使能信号</td></tr><tr><td>aluControlSel</td><td>O</td><td>3</td><td>alu操作数选择信号<br>000:rs/rt<br>001:rs/imm</td></tr><tr><td>ALUop</td><td>O</td><td>4</td><td>ALU运算模式选择信号</td></tr><tr><td>MemWrite</td><td>O</td><td>1</td><td>DM写使能信号</td></tr><tr><td>MemRead</td><td>O</td><td>1</td><td>DM读使能信号</td></tr><tr><td>EXTop</td><td>O</td><td>1</td><td>EXT扩展模式选择信号</td></tr><tr><td>RegDst</td><td>O</td><td>3</td><td>GRF写回地址选择信号：<br>001:rt<br>000:rd<br>010:rs<br>011:GPR[31]</td></tr><tr><td>WDsel</td><td>O</td><td>2</td><td>GRF写入数据选择信号：<br>00:ALU运算结果<br>01:DM读出的数据（lw）<br>10:PC + 4</td></tr><tr><td>NPCop</td><td>O</td><td>3</td><td>PC更新模式选择信号:<br>000:顺序执行<br>001:beq分支跳转<br>010:j/jal跳转<BR>011:jr跳转</td></tr></tbody></table></li></ul><h1 id="测试方案">测试方案</h1><h2 id="工具">工具</h2><p>借用Mars_CO.jar进行检查。</p><h3 id="使用">使用</h3><ol><li>命令行进入Mars_CO.jar所在目录</li><li>测试文件也放在这个目录下</li><li>在命令行运行<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar Mars_CO.jar test.asm mc CompactLargeText coL1</span><br></pre></td></tr></table></figure></li></ol><h1 id="思考题">思考题</h1><ol><li><p>阅读下面给出的 DM 的输入示例中（示例 DM 容量为 4KB，即 32bit × 1024字），根据你的理解回答，这个 addr 信号又是从哪里来的？地址信号 addr 位数为什么是 [11:2] 而不是 [9:0] ？</p><p><img src="/images/CO/P4/dm%E6%8E%A5%E5%8F%A3.png" alt="DM示意图"></p><ul><li>这个addr由alu给出（alu对<code>gpr(base)</code>和<code>(sign_ext)offset</code>做加运算）</li><li>addr以字节为单位，对应到以字为单位的DM，故应除以4，即取[11:2]</li></ul></li><li><p>思考上述两种控制器设计的译码方式，给出代码示例，并尝试对比各方式的优劣。</p><ul><li>记录<code>指令对应的控制信号</code>如何取值:<ul><li>优点：思考流畅，一次模拟一整条指令的运行过程即可；便于调试，找到出错指令对应分支进行检查即可</li><li>缺点：controll模块繁杂</li></ul></li><li>记录<code>控制信号</code>每种取值所<code>对应的指令</code>:<ul><li>优点：每个信号利用一个assign表达式描述即可，代码冗余少；</li><li>缺点：可读性差，较难找出错误在哪儿</li></ul></li></ul></li><li><p>在相应的部件中，复位信号的设计都是同步复位，这与 P3 中的设计要求不同。请对比同步复位与异步复位这两种方式的 reset 信号与 clk 信号优先级的关系。</p><ul><li>同步复位：clk优先</li><li>异步复位：reset优先</li></ul></li><li><p>C 语言是一种弱类型程序设计语言。C 语言中不对计算结果溢出进行处理，这意味着 C 语言要求程序员必须很清楚计算结果是否会导致溢出。因此，如果仅仅支持 C 语言，MIPS 指令的所有计算指令均可以忽略溢出。 请说明为什么在忽略溢出的前提下，addi 与 addiu 是等价的，add 与 addu 是等价的。</p><ul><li><p><code>add</code>和<code>addu</code> 执行的加法计算是完全一样的,唯一的区别在于<code>add</code>指令多了一个<code>溢出检测</code>和<code>异常处理</code>的步骤:</p><pre><code>   if temp32 ≠ temp31 then   SignalException(IntegerOverflow)   else   GPR[rd] ← temp31..0   endif</code></pre><p>故<mark>忽略溢出</mark>时add与addu等价。</p></li><li><p><code>addi</code>和<code>addiu</code>同理</p></li></ul></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;改动&quot;&gt;改动&lt;/h1&gt;
&lt;p&gt;相比P3，需要增加的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自行实现ROM、RAM&lt;/li&gt;
&lt;li&gt;实例化&amp;amp;端口映射&lt;/li&gt;
&lt;li&gt;改为同步复位&lt;/li&gt;
&lt;li&gt;用initial对reg赋初值&lt;/li&gt;
&lt;li&gt;对P3中集成al</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>BUAA-CO-P3 基于logisim的单周期MIPS架构CPU</title>
    <link href="https://crazyinloo.github.io/2025/11/10/CO-P3/"/>
    <id>https://crazyinloo.github.io/2025/11/10/CO-P3/</id>
    <published>2025-11-10T13:18:00.000Z</published>
    <updated>2025-11-17T14:04:40.233Z</updated>
    
    <content type="html"><![CDATA[<h1 id="声明">声明</h1><p>P3对alu、grf的设计非常不合理，直接将各个可能的操作数接入alu，而且默认grf要读的寄存器是rs、rt。但因为足够应付需求（<s>懒得重构</s>）就保留了这种错误方法，但在后面的设计中都注意规避了。</p><h1 id="前置理解">前置理解</h1><h2 id="内存">内存</h2><p><strong>1. 哈佛结构（本CPU应用的）</strong>内存 = 数据内存（DM） + 指令内存（IM）</p><ul><li>IM：CPU只会从IM读取指令，永远不会写入指令     <span id="mjx-3ad7f19">      <style>      #mjx-3ad7f19{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   使用ROM</li><li>DM：可读（lw）可写（sw）    <span id="mjx-0e28971">      <style>      #mjx-0e28971{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.054ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.242ex" role="img" focusable="false" viewBox="0 -525 1000 549" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D2" d="M580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">⇒</mo></math></mjx-assistive-mml></mjx-container>    </span>   使用RAM</li></ul><p><strong>2. 冯·诺伊曼结构</strong>指令和数据存放在同一个物理内存RAM中</p><h2 id="指令处理">指令处理</h2><ol><li>用RTL描述每条指令<ul><li>    <span id="mjx-e2a5d478">      <style>      #mjx-e2a5d478{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.181ex" role="img" focusable="false" viewBox="0 -511 1000 522" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="2190" d="M944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">←</mo></math></mjx-assistive-mml></mjx-container>    </span>  ：数据传送方向；</li><li>R[a] : 寄存器 a；</li><li>M[a] : 主存中地址为a的单元；</li><li>PC  ：程序计数器</li><li>f(data) : 表示对数据data进行f操作</li></ul></li><li>加指令：<ul><li>R/I/J</li><li>看清指令的RTL描述，把数据流搞清楚</li></ul></li><li>测试指令直接使用<code>$3</code>这样的寄存器，更易读</li></ol><h2 id="Debug">Debug</h2><blockquote><p>Wrong instruction behavior:in MIPS code 0x3c09cba1,we got ‘@00003030: $9 &lt;= 0xcba10000’when we expected ‘@0000303c: $11 &lt;= 0x00030000’.The wrong behavior was next to the correct execution of MIPS code 0x3c083bc2.</p></blockquote><table><thead><tr><th>部分</th><th>含义</th></tr></thead><tbody><tr><td><strong>MIPS code 0x3c09cba1</strong></td><td>实际出错的机器码（十六进制）</td></tr><tr><td><strong>‘@00003030: $9 &lt;= 0xcba10000’</strong></td><td>当<code>PC = 00003030</code>时，<code>0xcba10000</code>被写入<code>$9</code></td></tr><tr><td><strong>next to …</strong></td><td>出错前的最后一条<strong>正确</strong>执行的指令（帮助你定位上下文）</td></tr></tbody></table><ol><li><p>机器码     <span id="mjx-87ff9db8">      <style>      #mjx-87ff9db8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.181ex" role="img" focusable="false" viewBox="0 -511 1000 522" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="2192" d="M56 237T56 250T70 270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H70Q56 237 56 250Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">→</mo></math></mjx-assistive-mml></mjx-container>    </span>  指令：转化为32位机器码，翻译为指令，例如：</p><table><thead><tr><th>opcode</th><th>rs</th><th>rt</th><th>immediate</th></tr></thead><tbody><tr><td>001101</td><td>00110</td><td>00110</td><td>0110011001101100</td></tr></tbody></table>    <span id="mjx-af93b2">      <style>      #mjx-af93b2{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" display="true" style="position: relative;"><svg style="vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="1.382ex" height="2.009ex" role="img" focusable="false" viewBox="0 -694 611 888" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="21D3" d="M401 694Q412 694 422 681V375L423 70L435 81Q487 130 551 162Q564 170 570 170Q572 170 579 163V150Q579 138 577 135T564 126Q541 114 518 99T453 48T374 -46T318 -177Q313 -194 305 -194T293 -178T272 -119T225 -31Q158 70 46 126Q35 132 33 135T31 150V163Q38 170 40 170Q46 170 59 162Q122 131 176 81L188 70V375L189 681Q199 694 208 694Q219 694 228 680V352L229 25L238 12Q279 -42 305 -102Q344 -23 373 13L382 25V678Q387 692 401 694Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mo stretchy="false">⇓</mo></math></mjx-assistive-mml></mjx-container>    </span>  <pre><code> ori $6, $6, 0x666c</code></pre></li><li><p>PC:起始地址为00003000</p></li></ol><h2 id="简化操作的logisim部件">简化操作的logisim部件</h2><ul><li>odd/even partry：odd/even输出1</li><li>Bit Finder：找到最高位/最低位1/0的位置</li><li>negator：取负</li><li>Bit Adder:不要傻傻地自己去写 (TT…</li></ul><h2 id="易错">易错</h2><ol><li>输出的regWrite等信号是否为终值？<ul><li>即：到底有没有写入？</li></ul></li></ol><h1 id="模块设计">模块设计</h1><h2 id="IM-（指令存储器）">IM （指令存储器）</h2><ul><li>核心任务：根据PC中的地址，从ROM中读出指令输出</li><li>整体设计<ul><li><strong>地址转换逻辑</strong>：<ul><li>地址偏移：pc - 0x00003000</li><li>将PC的字节地址转换为ROM的字地址</li></ul></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>PC</td><td>I</td><td>32</td><td>指令的地址</td></tr><tr><td>Instruction</td><td>O</td><td>32</td><td>指令机器码</td></tr></tbody></table></li></ul><h2 id="GRF（通用寄存器组）">GRF（通用寄存器组）</h2><ul><li><p>核心任务：为ALU提供快速的数据源，并接收计算结果</p></li><li><p>整体设计</p><ul><li>读数据：指令最多需要同时读取<code>两个</code>不同地址的数据 - <code>两个读端口</code></li><li>写数据</li><li><blockquote><p>0 号寄存器的值始终保持为 0。其他寄存器初始值（复位后）均为 0，无需专门设置</p></blockquote></li></ul></li><li><p>模块规格：</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>RA1</td><td>I</td><td>5</td><td>读地址1</td></tr><tr><td>RA2</td><td>I</td><td>5</td><td>读地址2</td></tr><tr><td>WA</td><td>I</td><td>5</td><td>写地址</td></tr><tr><td>WD</td><td>I</td><td>32</td><td>写数据</td></tr><tr><td>RegWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>RD1</td><td>O</td><td>32</td><td>读数据1</td></tr><tr><td>RD2</td><td>O</td><td>32</td><td>读数据2</td></tr></tbody></table><p>注：这里的“地址”指的是GRF中的第n个reg</p></li></ul><h2 id="ALU">ALU</h2><ul><li>整体设计<ul><li>能够实现多种运算功能，并根据op选择对应功能<table><thead><tr><th>op</th><th>运算</th></tr></thead><tbody><tr><td>0000</td><td>无符号<code>rs + rt</code></td></tr><tr><td>0001</td><td>无符号<code>rs - rt</code></td></tr><tr><td>0010</td><td><code>rs &amp; imm</code></td></tr><tr><td>0011</td><td><code>rs | imm</code></td></tr><tr><td>0100</td><td>16位立即数加载至高位</td></tr><tr><td>0101</td><td><code>rs + imm</code></td></tr></tbody></table></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>op</td><td>I</td><td>4</td><td>选择运算功能</td></tr><tr><td>rs</td><td>I</td><td>32</td><td>rs value</td></tr><tr><td>rt</td><td>I</td><td>32</td><td>rt value</td></tr><tr><td>immEXT</td><td>I</td><td>32</td><td>扩展后的立即数</td></tr><tr><td>result</td><td>O</td><td>32</td><td>运算结果</td></tr><tr><td>equal</td><td>O</td><td>1</td><td>判断是否相等</td></tr></tbody></table></li></ul><h2 id="DM（数据存储器）">DM（数据存储器）</h2><ul><li>核心任务根据 <code>CPU</code> 提供的地址，进行<code>读或写操作</code>。它连接了 CPU 的核心与外部数据存储。</li><li>整体设计<ul><li><p>使用 <code>RAM</code> 实现，容量为 <code>3072 × 32bit</code>，应具有异步复位功能，<strong>复位值</strong>为 <code>0x00000000</code>。</p></li><li><p><strong>起始地址</strong>：<code>0x00000000</code>。<strong>地址范围</strong>：<code>0x00000000 ~ 0x00002FFF</code>。</p></li><li><p>RAM 应使用<code>双端口模式</code>，即设置 RAM 的 <code>Data Interface</code> 属性为 <code>Separate load and store ports</code>。</p></li></ul></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>Address</td><td>I</td><td>32</td><td>读/写地址</td></tr><tr><td>WriteData</td><td>I</td><td>32</td><td>要写入的数据</td></tr><tr><td>MemWrite</td><td>I</td><td>1</td><td>写使能信号</td></tr><tr><td>MemRead</td><td>I</td><td>1</td><td>读使能信号</td></tr><tr><td>clk</td><td>I</td><td>1</td><td>时钟信号</td></tr><tr><td>reset</td><td>I</td><td>1</td><td>异步复位信号</td></tr><tr><td>MemData</td><td>O</td><td>32</td><td>读出的数据</td></tr></tbody></table></li></ul><h2 id="EXT（扩展单元）">EXT（扩展单元）</h2><ul><li>核心任务把16位立即数扩展到32位</li><li>整体设计能够对立即数进行<code>零扩展/符号扩展</code></li><li>模块规格<table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>immIn</td><td>I</td><td>16</td><td>待扩展的立即数</td></tr><tr><td>op</td><td>I</td><td>1</td><td>扩展方式选择信号：<br>1 - 符号扩展 <br>0 - 零扩展</td></tr><tr><td>immOut</td><td>O</td><td>32</td><td>扩展后的立即数</td></tr></tbody></table></li></ul><h2 id="Controller">Controller</h2><ul><li><p>核心任务：根据当前正在执行的<code>指令</code>输出对应控制信号</p></li><li><p>整体设计解码逻辑 = 和逻辑 + 或逻辑</p><ul><li><p>和逻辑：<strong>识别</strong></p><ul><li>将输入的机器码识别为相应指令</li></ul></li><li><p>或逻辑：<strong>生成</strong></p><ul><li>根据输入指令生成对应的控制信号</li><li>控制信号表;<table><thead><tr><th>控制信号\指令</th><th>add</th><th>sub</th><th>ori</th><th>lw</th><th>sw</th><th>beq</th><th>lui</th><th>addi</th><th>j</th></tr></thead><tbody><tr><td>RegWrite</td><td>1</td><td>1</td><td>1</td><td>1</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td></tr><tr><td>ALUop</td><td>0000</td><td>0001</td><td>0011</td><td>0101</td><td>0101</td><td>0000</td><td>0100</td><td>0101</td><td>0000</td></tr><tr><td>MemWrite</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>MemRead</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>EXTop</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td><td>0</td><td>1</td><td>0</td></tr><tr><td>RegDst</td><td>00</td><td>00</td><td>01</td><td>01</td><td>00</td><td>00</td><td>01</td><td>01</td><td>00</td></tr><tr><td>WDsel</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>NPCop</td><td>00</td><td>00</td><td>00</td><td>00</td><td>00</td><td>01</td><td>00</td><td>00</td><td>10</td></tr></tbody></table></li></ul></li></ul></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>opcode</td><td>I</td><td>6</td><td>指令[31:26]位</td></tr><tr><td>funct</td><td>I</td><td>6</td><td>指令[5:0]位</td></tr><tr><td>RegWrite</td><td>O</td><td>1</td><td>GRF写使能信号</td></tr><tr><td>ALUop</td><td>O</td><td>4</td><td>ALU运算模式选择信号</td></tr><tr><td>MemWrite</td><td>O</td><td>1</td><td>DM写使能信号</td></tr><tr><td>MemRead</td><td>O</td><td>1</td><td>DM读使能信号</td></tr><tr><td>EXTop</td><td>O</td><td>1</td><td>EXT扩展模式选择信号</td></tr><tr><td>RegDst</td><td>O</td><td>2</td><td>GRF写回地址选择信号：<br>01:rt<br>00:rd<br>10:rs</td></tr><tr><td>WDsel</td><td>O</td><td>2</td><td>GRF写入数据选择信号：<br>0:ALU运算结果<br>1:DM读出的数据（lw）</td></tr><tr><td>NPCop</td><td>O</td><td>2</td><td>PC更新模式选择信号:<br>00:顺序执行<br>01:beq分支跳转<br>10:j跳转</td></tr></tbody></table></li></ul><h2 id="NPC">NPC</h2><ul><li><p>核心任务计算下一周期PC应更新成的值</p></li><li><p>整体设计</p><ul><li>顺序执行： <code>NPC = PC + 4</code><ul><li>分支跳转：<code>NPC = (PC + 4) + (SignExtend(offset))</code></li><li>j跳转：NPC = PC31…28||instr_index||00</li></ul></li></ul></li><li><p>模块规格</p><table><thead><tr><th>信号名</th><th>方向</th><th>位宽</th><th>描述</th></tr></thead><tbody><tr><td>immExt</td><td>I</td><td>32</td><td>拓展后的立即数（offset）</td></tr><tr><td>instr_index</td><td>I</td><td>26</td><td>instr_index</td></tr><tr><td>equal</td><td>I</td><td>1</td><td>判断reg rs、rt所存值是否相同</td></tr><tr><td>NPCop</td><td>I</td><td>2</td><td>00:NPC = PC + 4<br>01:分支跳转<br>10:j</td></tr><tr><td>PC</td><td>I</td><td>32</td><td>当前指令地址</td></tr><tr><td>NPC</td><td>O</td><td>32</td><td>下一条指令地址</td></tr></tbody></table></li></ul><h1 id="测试">测试</h1><blockquote><p>核心思路：让 CPU 在执行指令后，将关键的结果存储到DM的特定位置。测试结束后，比较 Logisim 和 Mars 的 DM 内容是否完全一致</p></blockquote><h2 id="测试方法">测试方法</h2><h3 id="环境设置">环境设置</h3><ul><li>选择Compact,Data at Address 0</li></ul><h3 id="编写MIPS汇编测试程序">编写MIPS汇编测试程序</h3><ol><li>初始化<ul><li>初始化寄存器：初始化为不同的非零值</li><li>初始化指针：设置$t0作为指向DM的指针，初始值为0x0000</li></ul></li><li>书写程序<ul><li>执行一条指令，保存一个结果，移动一次指针<ul><li>对于直接产生结果的指令（如add、ori）<ul><li>直接将结果保存到内存</li></ul></li><li>对于不直接产生结果的指令（如beq、j）<ul><li>构造场景，使得<code>跳转成功与否</code>导致<code>存入内存的值</code>不同</li></ul></li></ul></li><li>例如：  <figure class="highlight mips"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.text</span></span><br><span class="line"><span class="comment"># .globl main 告诉汇编器 main 是一个全局标签，程序的入口</span></span><br><span class="line">.globl main</span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">main:</span></span><br><span class="line">    <span class="comment"># --- 1. 初始化阶段 ---</span></span><br><span class="line">    <span class="comment"># 初始化寄存器为非零值</span></span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">s0</span>, $<span class="built_in">zero</span>, <span class="number">10</span></span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">s1</span>, $<span class="built_in">zero</span>, <span class="number">20</span></span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">s2</span>, $<span class="built_in">zero</span>, <span class="number">10</span></span><br><span class="line">    <span class="comment"># ... 初始化更多寄存器 ...</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 初始化内存指针 $t0</span></span><br><span class="line">    <span class="keyword">addiu </span>$<span class="built_in">t0</span>, $<span class="built_in">zero</span>, <span class="number">0x0000</span> <span class="comment"># $t0 = 0x0000, 指向 DM 的开始</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 2. 测试指令并保存结果 ---</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 测试 add 指令 ---</span></span><br><span class="line">    <span class="keyword">add </span>$<span class="built_in">t1</span>, $<span class="built_in">s0</span>, $<span class="built_in">s1</span>      <span class="comment"># $t1 = 10 + 20 = 30</span></span><br><span class="line">    <span class="keyword">sw </span>$<span class="built_in">t1</span>, <span class="number">0</span>($<span class="built_in">t0</span>)         <span class="comment"># 将结果 30 保存到内存地址 0x0000</span></span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">t0</span>, $<span class="built_in">t0</span>, <span class="number">4</span>       <span class="comment"># 指针移动到 0x0004</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 测试 beq (分支不发生) ---</span></span><br><span class="line">    <span class="keyword">beq </span>$<span class="built_in">s0</span>, $<span class="built_in">s1</span>, <span class="keyword">BRANCH_TAKEN </span><span class="comment"># 10 != 20, 不会跳转</span></span><br><span class="line">    <span class="comment"># 如果没跳转，存入 0x0</span></span><br><span class="line">    <span class="keyword">addiu </span>$<span class="built_in">t2</span>, $<span class="built_in">zero</span>, <span class="number">0x0</span></span><br><span class="line">    <span class="keyword">sw </span>$<span class="built_in">t2</span>, <span class="number">0</span>($<span class="built_in">t0</span>)</span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">t0</span>, $<span class="built_in">t0</span>, <span class="number">4</span></span><br><span class="line">    <span class="keyword">j </span>END_BRANCH_1</span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">BRANCH_TAKEN:</span></span><br><span class="line">    <span class="comment"># 如果跳转了，存入 0x1</span></span><br><span class="line">    <span class="keyword">addiu </span>$<span class="built_in">t2</span>, $<span class="built_in">zero</span>, <span class="number">0x1</span></span><br><span class="line">    <span class="keyword">sw </span>$<span class="built_in">t2</span>, <span class="number">0</span>($<span class="built_in">t0</span>)</span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">t0</span>, $<span class="built_in">t0</span>, <span class="number">4</span></span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">END_BRANCH_1:</span></span><br><span class="line">    <span class="comment"># --- 测试 beq (分支发生) ---</span></span><br><span class="line">    <span class="keyword">beq </span>$<span class="built_in">s0</span>, $<span class="built_in">s2</span>, <span class="keyword">BRANCH_TAKEN_2 </span><span class="comment"># 10 == 10, 应该跳转</span></span><br><span class="line">    <span class="comment"># 如果没跳转，存入 0x0</span></span><br><span class="line">    <span class="keyword">addiu </span>$<span class="built_in">t2</span>, $<span class="built_in">zero</span>, <span class="number">0x0</span></span><br><span class="line">    <span class="keyword">sw </span>$<span class="built_in">t2</span>, <span class="number">0</span>($<span class="built_in">t0</span>)</span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">t0</span>, $<span class="built_in">t0</span>, <span class="number">4</span></span><br><span class="line">    <span class="keyword">j </span>END_BRANCH_2</span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">BRANCH_TAKEN_2:</span></span><br><span class="line">    <span class="comment"># 如果跳转了，存入 0x1</span></span><br><span class="line">    <span class="keyword">addiu </span>$<span class="built_in">t2</span>, $<span class="built_in">zero</span>, <span class="number">0x1</span></span><br><span class="line">    <span class="keyword">sw </span>$<span class="built_in">t2</span>, <span class="number">0</span>($<span class="built_in">t0</span>)</span><br><span class="line">    <span class="keyword">addi </span>$<span class="built_in">t0</span>, $<span class="built_in">t0</span>, <span class="number">4</span></span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">END_BRANCH_2:</span></span><br><span class="line">    <span class="comment"># --- 3. 结束程序 ---</span></span><br><span class="line">    <span class="comment"># 可以用一个无限循环来停住 CPU</span></span><br><span class="line"><span class="symbol">END_LOOP:</span></span><br><span class="line">    <span class="keyword">j </span>END_LOOP</span><br></pre></td></tr></table></figure></li></ul></li><li>在Mars中生成标答<ol><li>执行程序</li><li>手动点击Pause暂停死循环</li><li>导出DMFile - Dump Memory<ul><li>选择Data Segment</li><li>选择Hexadecimal Text格式</li><li>Dump to file得到txt文件</li><li>在txt文件开头加上<code>v2.0 raw</code></li></ul></li></ol></li></ol><h3 id="在logisim中运行CPU">在logisim中运行CPU</h3><ol><li>找到IM中的ROM，右键选择<code>Load Image</code></li><li>reset<ol><li>看DM<ol><li>运行时钟直到进入死循环</li><li>找到DM中的RAM，右键选择<code>Edit Content</code></li></ol></li><li>实例化grf后直接观察grf<ol><li>右键main中grf，选择<code>view grf</code></li><li><code>ctrl + T</code>开始观察即可</li></ol></li></ol></li></ol><h2 id="测试数据">测试数据</h2><h3 id="计算类指令功能测试">计算类指令功能测试</h3><ol><li>寄存器数据:<ol><li><strong>0及附近的数</strong>：−2,−1,0,1,2</li><li>32 位数<strong>边界附近的数</strong>：−2147483648,−2147483647,2147483646,2147483647</li><li>32 位数<strong>范围内的一些随机数</strong>：−1000786109,1919156834,…</li></ol></li><li>无符号立即数:<ol><li>0 及附近的数:0,1,2,3</li><li>16 位无符号数边界附近的数：65533,65534,65535</li><li>16 位无符号数范围内的一些随机数：25779,42528,…</li></ol></li><li>符号立即数:<ol><li>0 及附近的数：−2,−1,0,1,2</li><li>16 位符号数边界附近的数:−32768,−32767,32766,32767</li><li>16 位符号数范围内的一些随机数：−5329,25299,…</li></ol></li></ol><h3 id="存取类指令功能测试">存取类指令功能测试</h3><ol><li>offset :+/-/0</li><li>$base:+/-/0</li></ol><h3 id="跳转类指令功能测试">跳转类指令功能测试</h3><ul><li>跳转，且目标在此跳转指令之前</li><li>跳转，且目标是此跳转指令</li><li>跳转，且目标在此跳转指令之后</li><li>不跳转，且目标在此跳转指令之前</li><li>不跳转，且目标是此跳转指令</li><li>不跳转，且目标在此跳转指令之后</li></ul><h1 id="可能添加的">可能添加的</h1><h2 id="lb-sb">lb/sb</h2><p>dm本身不变</p><ul><li><strong>lb</strong>：dm取字后再经MUX，将Addr[1:0]作为选择端，选出真正要读出的字节</li><li><strong>sb</strong>：先利用MUX选出要读出的字节<ul><li>太麻烦暂时不考虑</li><li>多周期CPU中实现……</li></ul></li></ul><h1 id="思考题">思考题</h1><ol><li><p>上面我们介绍了通过 FSM 理解单周期 CPU 的基本方法。请大家指出单周期 CPU 所用到的模块中，哪些发挥状态存储功能，哪些发挥状态转移功能。</p><blockquote><p>状态存储：GRF、PC、DM；状态转移：NPC、Controller、EXT、ALU</p></blockquote></li><li><p>现在我们的模块中 IM 使用 ROM， DM 使用 RAM， GRF 使用 Register，这种做法合理吗？ 请给出分析，若有改进意见也请一并给出。</p><blockquote><p>合理。</p><ol><li>IM没有增加、修改或删除指令的需求，所以用ROM（Read-Only Memory）可以覆盖需求，而且可以避免指令被意外修改导致程序故障；</li><li>DM需要实现数据的写入和读出，所以使用RAM即可；</li><li>GRF使用register也可以完状态储存的需求。</li></ol></blockquote><blockquote><p>改进：用同一个RAM储存Instructions和Data，可以支持自修改代码，内存使用也更灵活</p></blockquote></li><li><p>在上述提示的模块之外，你是否在实际实现时设计了其他的模块？如果是的话，请给出介绍和设计的思路。</p><blockquote><p>无</p></blockquote></li><li><p>事实上，实现 nop 空指令，我们并不需要将它加入控制信号真值表，为什么？</p><blockquote><p>因为nop指令本质上就是<code>sll $0, $0, 0</code>的R型指令，机器码为0x00000000。把它当作R型指令处理，执行时任何存储单元的值都不会发生变化，所以不用把它再加入控制信号真值表。</p></blockquote></li><li><p>阅读 Pre 的 “MIPS 指令集及汇编语言” 一节中给出的测试样例，评价其强度（可从各个指令的覆盖情况，单一指令各种行为的覆盖情况等方面分析），并指出具体的不足之处。</p><blockquote><ol><li>寄存器数据、立即数方面：没有测试边界附近的数；没有测试目标寄存器为0的情况</li><li>存取类指令：没有测试offset为负的情况</li><li>跳转类指令：没有测试跳转到前面和当前指令的情况</li></ol></blockquote></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;声明&quot;&gt;声明&lt;/h1&gt;
&lt;p&gt;P3对alu、grf的设计非常不合理，直接将各个可能的操作数接入alu，而且默认grf要读的寄存器是rs、rt。但因为足够应付需求（&lt;s&gt;懒得重构&lt;/s&gt;）就保留了这种错误方法，但在后面的设计中都注意规避了。&lt;/p&gt;
&lt;h1 id=&quot;</summary>
      
    
    
    
    <category term="CO" scheme="https://crazyinloo.github.io/categories/CO/"/>
    
    
  </entry>
  
  <entry>
    <title>2025-BUAA-OOPre学习心得</title>
    <link href="https://crazyinloo.github.io/2025/11/06/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/"/>
    <id>https://crazyinloo.github.io/2025/11/06/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/</id>
    <published>2025-11-06T12:30:00.000Z</published>
    <updated>2025-11-06T14:38:27.934Z</updated>
    
    <content type="html"><![CDATA[<h1 id="整体架构">整体架构</h1><h2 id="UML类图">UML类图</h2><p><img src="/images/OO/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/oopreUML.png" alt="alt text"></p><h2 id="Main类">Main类</h2><p>接收控制台读入，并对读入的字符串进行解析,获取对应的指令并执行指令。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">CommandFactory</span> <span class="variable">factory</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CommandFactory</span>();</span><br><span class="line"><span class="type">Command</span> <span class="variable">cmd</span> <span class="operator">=</span> factory.parse(strings);</span><br><span class="line">cmd.execute(strings);</span><br></pre></td></tr></table></figure><h1 id="迭代调整">迭代调整</h1><h2 id="分离思想">分离思想</h2><p>每个class功能应遵守单一职责原则，故当迭代中发现某个类功能<strong>过于繁杂、修改一动而牵全身</strong>时，应进行分离处理。</p><ol><li>在发现Adventurer类变得过于繁杂之后，<strong>分离</strong>了其中处理Portable（可携带品）的功能：<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Adventurer class</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> Inventory inventory;</span><br></pre></td></tr></table></figure>在Inventory内部实现涉及到Portable的操作。<img src="/images/OO/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/inventory.png" alt="alt text"></li></ol><h2 id="命令模式">命令模式</h2><p>迭代过程中不断需要添加指令。初始设计为在Main类中用<code>case结构</code>执行对应指令，但很快发现：</p><ol><li>Main类中方法过长</li><li>添加指令不方便</li></ol><p>因此引入<code>Command Pattern</code>设计模式，优化指令可拓展性并简化Main类</p><h2 id="单例模式">单例模式</h2><p>对Adventurer实例的管理：采取<code>单例模式</code>，创建<code>World类</code>，保证所有操作都是在同一个World实例里执行的。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">World</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Map&lt;String, Adventurer&gt; adventurerMap = <span class="keyword">new</span> <span class="title class_">HashMap</span>&lt;&gt;();</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">World</span> <span class="variable">world</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">World</span>(adventurerMap);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">private</span> <span class="title function_">World</span><span class="params">(Map&lt;String, Adventurer&gt; adventurerMap)</span> &#123;</span><br><span class="line">        World.adventurerMap = adventurerMap;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> World <span class="title function_">getInstance</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> world;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">public</span> Map&lt;String, Adventurer&gt; <span class="title function_">getAdventurerMap</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> adventurerMap;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="工厂模式">工厂模式</h2><p>将创建各种Usable的方法集成于CreateFactory类中。<img src="/images/OO/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/image-30.png" alt="alt text"></p><h2 id="容器选择">容器选择</h2><p>几乎所有操作的都涉及到<code>id</code>和<code>object</code>的对应关系（<code>key-value</code>），故基本都采用<code>HashMap</code>来管理对象。但，一旦涉及到<strong>顺序性</strong>，就必须更换容器，例如：</p><ol><li>fight指令涉及到战斗对象的先后顺序，故使用ArrayList来储存</li><li>携带物品的操作涉及<code>FIFO</code>，故在Inventory中采用：<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> Map&lt;String, LinkedList&lt;Portable&gt;&gt; bag;</span><br></pre></td></tr></table></figure>来记录携带信息</li></ol><h1 id="使用JUnit的心得体会">使用JUnit的心得体会</h1><ol><li>如果一个类很难被测试，通常意味着它的设计存在问题（例如职责不清、耦合度过高），进而推动我们修改代码。</li></ol><h1 id="学习OOPre的心得体会">学习OOPre的心得体会</h1><ol><li>什么才是一份好的代码？<ul><li>易于维护、扩展和复用<ul><li>尝试使用设计模式</li><li>遵守设计原则：单一职责、开闭……</li></ul></li></ul></li><li>面向过程到面向对象的思维转变<ul><li>思考应设计什么对象、对象应具备什么属性和行为、对象之间如何协作</li></ul></li></ol><h1 id="对OOPre课程的简单建议">对OOPre课程的简单建议</h1><ol><li>迭代作业每次要切换仓库，导致版本管理流程（如commit、push等）较为繁琐，建议统一使用同一个仓库来进行迭代开发。</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;整体架构&quot;&gt;整体架构&lt;/h1&gt;
&lt;h2 id=&quot;UML类图&quot;&gt;UML类图&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/OO/2025-BUAA-OOPre%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97/oopreUML.png&quot; </summary>
      
    
    
    
    <category term="OO" scheme="https://crazyinloo.github.io/categories/OO/"/>
    
    
  </entry>
  
  <entry>
    <title>To Begin</title>
    <link href="https://crazyinloo.github.io/2025/10/11/toBegin/"/>
    <id>https://crazyinloo.github.io/2025/10/11/toBegin/</id>
    <published>2025-10-10T16:00:00.000Z</published>
    <updated>2025-12-02T07:26:19.561Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Operation">Operation</h1><hr><h2 id="本地打开">本地打开</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> C:\Users\69877\blog</span><br><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><h2 id="清除缓存">清除缓存</h2><p>ctrl + c 停止服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean &amp;&amp; hexo server</span><br></pre></td></tr></table></figure><h2 id="添加图片">添加图片</h2><p>在<code>blog/source/images</code>中添加即可，后续所有路径写成<code>/images/</code>的形式</p><h2 id="更改设置">更改设置</h2><p>路径：</p><blockquote><p>BLOG/node_modules/hexo-theme-candelas/_config.yml</p></blockquote><p>在里面更改。</p><h1 id="更新blog">更新blog</h1><p>更新需要一段时间请不要着急（）</p><hr><h2 id="路径">路径</h2><p>终端进入blog文件夹后，输入:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g -d</span><br></pre></td></tr></table></figure><h2 id="markdown格式相关">markdown格式相关</h2><h3 id="开头">开头</h3><pre><code><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Hello World</span><br><span class="line">date: 2025/10/11</span><br><span class="line">categories: </span><br><span class="line">- tech</span><br><span class="line">- new</span><br><span class="line">---</span><br></pre></td></tr></table></figure></code></pre><h3 id="常用效果">常用效果</h3><ol><li><p>代码 (Code)</p><ul><li>行内代码：用一对反引号<code>``</code>包裹。</li><li>代码块：用三对反引号```包裹，并在第一组反引号后<strong>声明语言类型</strong>，可以实现语法高亮e.g. <code>``` bash</code> xxx <code>```</code></li></ul></li><li><p>超链接<code>[title](link)</code></p></li><li><p>文本样式斜体 <code>* *</code>删除线<code>~~ ~~</code></p></li><li><p>引用</p><blockquote><p>用<code>&gt;</code>放在文段前来引用</p></blockquote></li><li><p>图片<code>![title](link)</code></p></li><li><p>换行段落间建议使用一个空行</p></li><li><p>插入Latex公式</p><ul><li>行内插入：<code>$E = \frac{1}{2}mv^2$</code></li><li>块级公式：<code>$$</code> <code>$$</code></li><li>常用Latex语法<ul><li><p>上标：<code>x^{20}</code></p></li><li><p>下标：<code>x_{10}</code></p></li><li><p>分数：<code>\frac{1}{2}</code></p></li><li><p>希腊字母</p><table><thead><tr><th>命令</th><th>显示</th><th>命令</th><th>显示</th></tr></thead><tbody><tr><td>\alpha</td><td>α</td><td>\beta</td><td>β</td></tr><tr><td>\gamma</td><td>γ</td><td>\delta</td><td>δ</td></tr><tr><td>\Delta</td><td>Δ</td><td>\epsilon</td><td>ϵ</td></tr><tr><td>\zeta</td><td>ζ</td><td>\eta</td><td>η</td></tr><tr><td>\theta</td><td>θ</td><td>\lambda</td><td>λ</td></tr><tr><td>\mu</td><td>μ</td><td>\nu</td><td>ν</td></tr><tr><td>\xi</td><td>ξ</td><td>\pi</td><td>π</td></tr><tr><td>\rho</td><td>ρ</td><td>\sigma</td><td>σ</td></tr><tr><td>\Sigma</td><td>Σ</td><td>\phi</td><td>ϕ</td></tr><tr><td>\Phi</td><td>Φ</td><td>\psi</td><td>ψ</td></tr><tr><td>\omega</td><td>ω</td><td>\Omega</td><td>Ω</td></tr></tbody></table></li><li><p>常见符号</p><ul><li><code>\sin</code></li><li><code>\sqrt[n]{expression}</code>     <span id="mjx-b4ca7ac">      <style>      #mjx-b4ca7ac{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.45ex;" xmlns="http://www.w3.org/2000/svg" width="12.848ex" height="2.398ex" role="img" focusable="false" viewBox="0 -861 5679 1060" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mroot"><g><g data-mml-node="mrow" transform="translate(853,0)"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(466,0)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(1038,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"></path></g><g data-mml-node="mi" transform="translate(1541,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(1992,0)"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"></path></g><g data-mml-node="mi" transform="translate(2458,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mi" transform="translate(2927,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"></path></g><g data-mml-node="mi" transform="translate(3396,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(3741,0)"><path data-c="1D45C" d="M201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120Z"></path></g><g data-mml-node="mi" transform="translate(4226,0)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g></g></g><g data-mml-node="mi" transform="translate(211.8,356.5) scale(0.5)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(0,1)"><path data-c="221A" d="M95 178Q89 178 81 186T72 200T103 230T169 280T207 309Q209 311 212 311H213Q219 311 227 294T281 177Q300 134 312 108L397 -77Q398 -77 501 136T707 565T814 786Q820 800 834 800Q841 800 846 794T853 782V776L620 293L385 -193Q381 -200 366 -200Q357 -200 354 -197Q352 -195 256 15L160 225L144 214Q129 202 113 190T95 178Z"></path></g><rect width="4826" height="60" x="853" y="741"></rect></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mroot><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mi>n</mi></mroot></math></mjx-assistive-mml></mjx-container>    </span>  </li><li><code>\times</code>     <span id="mjx-fd7c902">      <style>      #mjx-fd7c902{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: 0.02ex;" xmlns="http://www.w3.org/2000/svg" width="1.76ex" height="1.09ex" role="img" focusable="false" viewBox="0 -491 778 482" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>×</mo></math></mjx-assistive-mml></mjx-container>    </span>  ,<code>\div</code>     <span id="mjx-617860f">      <style>      #mjx-617860f{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.081ex;" xmlns="http://www.w3.org/2000/svg" width="1.76ex" height="1.296ex" role="img" focusable="false" viewBox="0 -537 778 573" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="F7" d="M318 466Q318 500 339 518T386 537Q418 537 438 517T458 466Q458 438 440 417T388 396Q355 396 337 417T318 466ZM56 237T56 250T70 270H706Q721 262 721 250T706 230H70Q56 237 56 250ZM318 34Q318 68 339 86T386 105Q418 105 438 85T458 34Q458 6 440 -15T388 -36Q355 -36 337 -15T318 34Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>÷</mo></math></mjx-assistive-mml></mjx-container>    </span>  ,<code>\cdot</code>     <span id="mjx-cbe7bde8">      <style>      #mjx-cbe7bde8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: 0.43ex;" xmlns="http://www.w3.org/2000/svg" width="0.629ex" height="0.271ex" role="img" focusable="false" viewBox="0 -310 278 120" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>⋅</mo></math></mjx-assistive-mml></mjx-container>    </span>  </li><li><code>\sum</code>     <span id="mjx-c4d60778">      <style>      #mjx-c4d60778{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="2.389ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1056 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="OP">∑</mo></math></mjx-assistive-mml></mjx-container>    </span>  ,<code>\int</code>     <span id="mjx-e5bbb1d8">      <style>      #mjx-e5bbb1d8{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.691ex;" xmlns="http://www.w3.org/2000/svg" width="1.38ex" height="2.514ex" role="img" focusable="false" viewBox="0 -805.5 610 1111" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo" transform="translate(0 0.5)"><path data-c="222B" d="M113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="OP">∫</mo></math></mjx-assistive-mml></mjx-container>    </span>  ,<code>\lim</code>     <span id="mjx-8a2d6648">      <style>      #mjx-8a2d6648{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="3.143ex" height="1.57ex" role="img" focusable="false" viewBox="0 -694 1389 694" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(278,0)"></path><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(556,0)"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="OP" movablelimits="true">lim</mo></math></mjx-assistive-mml></mjx-container>    </span>  </li><li><code>\infty</code>     <span id="mjx-d94a8de">      <style>      #mjx-d94a8de{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.262ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 1000 453" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="221E" d="M55 217Q55 305 111 373T254 442Q342 442 419 381Q457 350 493 303L507 284L514 294Q618 442 747 442Q833 442 888 374T944 214Q944 128 889 59T743 -11Q657 -11 580 50Q542 81 506 128L492 147L485 137Q381 -11 252 -11Q166 -11 111 57T55 217ZM907 217Q907 285 869 341T761 397Q740 397 720 392T682 378T648 359T619 335T594 310T574 285T559 263T548 246L543 238L574 198Q605 158 622 138T664 94T714 61T765 51Q827 51 867 100T907 217ZM92 214Q92 145 131 89T239 33Q357 33 456 193L425 233Q364 312 334 337Q285 380 233 380Q171 380 132 331T92 214Z"></path></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">∞</mi></math></mjx-assistive-mml></mjx-container>    </span>  </li><li><code>\rightarrow</code></li></ul></li><li><p>矩阵</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">A = \begin&#123;pmatrix&#125;</span><br><span class="line">a &amp; b \\\\</span><br><span class="line">c &amp; d</span><br><span class="line">\end&#123;pmatrix&#125;</span><br></pre></td></tr></table></figure><p>效果：</p>    <span id="mjx-6d4f7d5">      <style>      #mjx-6d4f7d5{        display:contents;        mjx-assistive-mml {          user-select: text !important;          clip: auto !important;          color: rgba(0,0,0,0);        }        mjx-container[jax="SVG"] {  direction: ltr;}mjx-container[jax="SVG"] > svg {  overflow: visible;  min-height: 1px;  min-width: 1px;}mjx-container[jax="SVG"] > svg a {  fill: blue;  stroke: blue;}mjx-assistive-mml {  position: absolute !important;  top: 0px;  left: 0px;  clip: rect(1px, 1px, 1px, 1px);  padding: 1px 0px 0px 0px !important;  border: 0px !important;  display: block !important;  width: auto !important;  overflow: hidden !important;  -webkit-touch-callout: none;  -webkit-user-select: none;  -khtml-user-select: none;  -moz-user-select: none;  -ms-user-select: none;  user-select: none;}mjx-assistive-mml[display="block"] {  width: 100% !important;}mjx-container[jax="SVG"][display="true"] {  display: block;  text-align: center;  margin: 1em 0;}mjx-container[jax="SVG"][display="true"][width="full"] {  display: flex;}mjx-container[jax="SVG"][justify="left"] {  text-align: left;}mjx-container[jax="SVG"][justify="right"] {  text-align: right;}g[data-mml-node="merror"] > g {  fill: red;  stroke: red;}g[data-mml-node="merror"] > rect[data-background] {  fill: yellow;  stroke: none;}g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {  stroke-width: 70px;  fill: none;}g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {  stroke-dasharray: 140;}g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {  stroke-linecap: round;  stroke-dasharray: 0,140;}g[data-mml-node="mtable"] > g > svg {  overflow: visible;}[jax="SVG"] mjx-tool {  display: inline-block;  position: relative;  width: 0;  height: 0;}[jax="SVG"] mjx-tool > mjx-tip {  position: absolute;  top: 0;  left: 0;}mjx-tool > mjx-tip {  display: inline-block;  padding: .2em;  border: 1px solid #888;  font-size: 70%;  background-color: #F8F8F8;  color: black;  box-shadow: 2px 2px 5px #AAAAAA;}g[data-mml-node="maction"][data-toggle] {  cursor: pointer;}mjx-status {  display: block;  position: fixed;  left: 1em;  bottom: 1em;  min-width: 25%;  padding: .2em .4em;  border: 1px solid #888;  font-size: 90%;  background-color: #F8F8F8;  color: black;}foreignObject[data-mjx-xml] {  font-family: initial;  line-height: normal;  overflow: visible;}mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {  stroke-width: 3;}g[data-mml-node="xypic"] path {  stroke-width: inherit;}.MathJax g[data-mml-node="xypic"] path {  stroke-width: inherit;}      }      </style>      <mjx-container class="MathJax" jax="SVG" display="true" style="position: relative;"><svg style="vertical-align: -2.149ex;" xmlns="http://www.w3.org/2000/svg" width="12.68ex" height="5.43ex" role="img" focusable="false" viewBox="0 -1450 5604.6 2400" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z"></path></g><g data-mml-node="mo" transform="translate(1027.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mrow" transform="translate(2083.6,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="mtable" transform="translate(736,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"></path></g></g><g data-mml-node="mtd" transform="translate(1574.5,0)"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd" transform="translate(48,0)"><g data-mml-node="mi"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path></g></g><g data-mml-node="mtd" transform="translate(1529,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(2785,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>A</mi><mo>=</mo><mrow data-mjx-texclass="INNER"><mo data-mjx-texclass="OPEN">(</mo><mtable columnspacing="1em" rowspacing="4pt"><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable><mo data-mjx-texclass="CLOSE">)</mo></mrow></math></mjx-assistive-mml></mjx-container>    </span>  </li></ul></li></ul></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Operation&quot;&gt;Operation&lt;/h1&gt;
&lt;hr&gt;
&lt;h2 id=&quot;本地打开&quot;&gt;本地打开&lt;/h2&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class</summary>
      
    
    
    
    <category term="杂项" scheme="https://crazyinloo.github.io/categories/%E6%9D%82%E9%A1%B9/"/>
    
    
  </entry>
  
</feed>
