<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>硬件设计 on ClearSec Wiki</title><link>https://www.clearsec.org/wikis/skills/hardware/</link><description>Recent content in 硬件设计 on ClearSec Wiki</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://www.clearsec.org/wikis/skills/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>计算机组成与设计</title><link>https://www.clearsec.org/wikis/skills/hardware/cod/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.clearsec.org/wikis/skills/hardware/cod/</guid><description>&lt;h1 id="计算机组成原理课程实验相关"&gt;《计算机组成原理》课程实验相关&lt;/h1&gt;
&lt;p&gt;首先必须要吹一波《计原》课程的大实验&lt;a href="https://lab.cs.tsinghua.edu.cn/cod-lab-docs-2022/"&gt;实验文档&lt;/a&gt;，基本涵盖了实验基础部分的所有内容，这里我就只再写一些个人感觉踩了不少坑的地方吧。&lt;/p&gt;
&lt;h2 id="关于-ucore-的另一些提示"&gt;关于 uCore 的另一些提示&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;精确异常：异常或中断发生时考虑 mepc 或 sepc 是否设置在了正确的位置，同时是否真的将发生异常的这条指令效果&lt;strong&gt;完全消除&lt;/strong&gt;。如 &lt;code&gt;sw a5, 0(a5)&lt;/code&gt; 这里发生了异常，那么请确保你的设计不会修改 &lt;code&gt;a5&lt;/code&gt; 的值。&lt;/li&gt;
&lt;li&gt;异常种类：和页表相关的异常是较为繁琐的，这里我推荐使用和做网原路由器实验时相同的方式，直接将对应的文档原文作为注释粘贴到代码中，然后一句话一句话实现。注意 Page Table Walker 进行虚实地址转换时也可能会遇到中间结果 Not Valid 异常。&lt;/li&gt;
&lt;li&gt;仿真工具：见下节。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="关于仿真工具"&gt;关于仿真工具&lt;/h2&gt;
&lt;p&gt;私以为限制很多组工作效率的真正原因是仿真工具。跟 Hoxxxr9 聊天时，其阐述过造机时的状态：改几行代码，开始用 Vivado 自带的仿真，然后打开一集《中二病也要谈恋爱》开始看，看完一集基本仿真波形才能跑的差不多，然后去看波形调时序（&lt;s&gt;把波形拟合成自己想要的样子&lt;/s&gt;）。然后再改几行代码，再开始仿真，进入下一个循环&amp;hellip;&lt;/p&gt;
&lt;p&gt;在这里我推荐一个速度更快的仿真工具 &lt;a href="https://verilator.org/guide/latest/"&gt;Verilator&lt;/a&gt;，一般想要将 uCore 仿真到开机自检时你出错的地方，即使去改 uCore 的代码删掉一些没用的功能也要 30min ~ 1h 左右，&lt;s&gt;更有甚者甚至晚上把仿真打开，第二天早上起来看波形&lt;/s&gt;，而 Verilator 可以在 1min 左右就完成这个工作。具体的安装过程我们这里不做赘述，请自行阅读其使用文档，而其使用过程大概可以概括为：写一个 Fake SRAM 与 Fake UART，然后在 testbench 里用这个器件换掉原来的器件，进而使用 Verilator 仿真。&lt;/p&gt;
&lt;p&gt;所谓 Fake，是说你自己去模拟这个器件的功能，并尽可能的保持你的实现与器件原来的实现一致，同时可以输出一些调试信息，比如在 UART 收到字符时用 &lt;code&gt;$display&lt;/code&gt; 直接打印到 stdout 里。&lt;/p&gt;
&lt;p&gt;同时，Verilator 自带的 code linter 功能可以在某种程度上起到帮助检查代码中错误的作用，也帮助了笔者在造机过程中解决了一些问题。比如把一个 26 位宽的信号往下传时不小心输出写 &lt;code&gt;wire[25:0]&lt;/code&gt;，输入写 &lt;code&gt;input wire&lt;/code&gt; 而丢了位宽，Vivado 只会报 Warning，而 Verilator 对于位宽不匹配则会报 Error 并提醒你修改或忽略。&lt;/p&gt;</description></item></channel></rss>