From 2a740500fab9a2f41cd17d4320f422e28ba11387 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Sun, 26 May 2024 23:10:14 +0800 Subject: [PATCH 01/18] :pencil: chisel + verilator --- docs/guide-for-beginner/git-tutorial.md | 2 +- docs/popular-science/bash-dlc.md | 2 +- docs/unofficial-lab-env/comp-organ-lab2.md | 127 +++++++++++++++++++++ 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 docs/unofficial-lab-env/comp-organ-lab2.md diff --git a/docs/guide-for-beginner/git-tutorial.md b/docs/guide-for-beginner/git-tutorial.md index 60a36a1..263f25e 100644 --- a/docs/guide-for-beginner/git-tutorial.md +++ b/docs/guide-for-beginner/git-tutorial.md @@ -38,7 +38,7 @@ Git 的管理是基于仓库(Repository)的,仓库可以看成一个储存 - 暂存区(Staging Area):即我们的缓存区,我们可以通过 `git add` 命令将工作区的文件(或文件的变动)添加到暂存区。暂存区存储了我们对文件的修改。 - 仓库(Repository):即我们的版本库,我们可以通过 `git commit` 命令将暂存区的文件提交到仓库。 -值得注意的是,由于我们对文件的编辑都发生在工作目录下,所以我们增删文件或对文件进行修改,都只会影响工作区,而不会影响暂存区和仓库。所以我们可以很容易地撤销在工作区发生的修改,这也是 Git 的优势之一。 我们真正想要在仓库中修改一个文件,实际上需要经历三个步骤: +值得注意的是,由于我们对文件的编辑都发生在工作目录下,所以我们增删文件或对文件进行修改,都只会影响工作区,而不会影响暂存区和仓库。所以我们可以很容易地撤销在工作区发生的修改,这也是 Git 的优势之一。我们真正想要在仓库中修改一个文件,实际上需要经历三个步骤: 1. 在工作目录中修改文件。 2. 使用 `git add` 将修改的文件添加到暂存区。 diff --git a/docs/popular-science/bash-dlc.md b/docs/popular-science/bash-dlc.md index 0163112..e3d9671 100644 --- a/docs/popular-science/bash-dlc.md +++ b/docs/popular-science/bash-dlc.md @@ -91,7 +91,7 @@ $ echo a{d,c,b}e ade ace abe ``` -大括号内还可以写数字/字符+增长,比如 `{x..y[..incr]}` +大括号内还可以写数字/字符 + 增长,比如 `{x..y[..incr]}` 大括号展开是严格 "词法" 的,它不会对任何特殊字符作出 "反应", 包括大括号自己: diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md new file mode 100644 index 0000000..0eb33ae --- /dev/null +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -0,0 +1,127 @@ +# 计算机组成原理实验 2 环境指南(非官方) + +以下指南适合有 linux 环境的同学使用。 + +笔者心态:对 verilog 感到不适,并且想折腾一些花样。 + +## 实验需要的工具 + +- verilator +- chisel +- gtkwave + +## 安装依赖 + +实验工具安装需要 + +- bison +- flex +- gcc +- git +- g++ +- java +- make +- sbt +- scala +- sdkman +- verilator + +通过以下命令可以安装 + +```sh +# Debian +sudo apt install build-essential git device-tree-compiler +# Ubuntu +sudo apt install build-essential git device-tree-compiler +# ArchLinux +sudo pacman -Sy base-devel git dtc +# opensuse +sudo zypper in -t pattern devel_C_C++ +``` + +如果配置环境过程中出现“command not found.”可能是有依赖的工具没装,此时可以利用搜索引擎。 + +## 安装 bison 和 flex + +bison 和 flex 是 gnu 提供的两个语法解析工具。 +(verilator 依赖这两个工具将 verilog 代码编译成 c++ 的 class) + +```sh +#opensuse +sudo zypper in bison flex +``` + +## 安装 verilator + +```sh +# 先 cd 到一个文件夹中,推荐 cd 到 ~/Downloads +git clone https://github.com/verilator/verilator +cd verilator +autoconf # Create ./configure script +./configure # Configure and create Makefile +make -j `nproc` # Build Verilator itself (if error, try just 'make') +sudo make install # 这会安装到 /usr 中 +``` + +如果需要一些个性化,比方说安装到非`/usr`目录,或者想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html#git-quick-install + +( 因为 verilator 在编译的时候,需要使用 gnu 方言,因此推荐使用 linux ) + +## 安装 sdkman + +```sh +curl -s "https://get.sdkman.io" | bash +``` + +安装过程中,注意看提示 + +## 安装 java + +```sh +sdk install java +``` + +## 安装 scala 2.12.13 + +```sh +sdk install scala 2.12.13 +``` + +## 安装 gtkwave + +```sh +# opensuse +sudo zypper in gtkwave +# windows +winget install gtkwave +# mac +brew install gtkwave +``` + +如果 windows/mac 作为宿主系统,应该是在 windows/mac 中安装 gtkwave,然后在 windows 打开 `.vcd` 文件。 + +但是 mac 实际上使用 gtkwave 会有点问题(无法双击打开)。但是可以在 shell 中 `gtkwave <.vcd>`打开。 + +如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) + +## 创建 chisel 项目 + +chisel 是 scala 的一个库并且目前为止并没有一个真正的 chisel IDE。我们可以通过官方的 chisel-template 创建我们的项目。 + +```sh +git clone https://github.com/chipsalliance/chisel-template.git +``` + +然后在 vscode 中打开我们的 chisel 就行了。当然也可以用其他的 IDE (neovim is the best ide in the world!) + +## 调试 chisel 生成的 verilog + +可以使用 C++ 和 verilator 调试我们的 module。 + +这是 verilator 的使用教程:https://itsembedded.com/dhd_list/ + +## 使用 gtkwave 打开波形仿真文件 + +```sh +gtkwave mul.vcd +``` From e2f39c71ff6b55952cb3d0ac748de55e53d3dde2 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 01:00:31 +0800 Subject: [PATCH 02/18] :pencil: --- docs/unofficial-lab-env/comp-organ-lab2.md | 242 +++++++++++++++++++-- 1 file changed, 229 insertions(+), 13 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 0eb33ae..66856b0 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -29,11 +29,11 @@ 通过以下命令可以安装 ```sh -# Debian +# debian/ubuntu sudo apt install build-essential git device-tree-compiler -# Ubuntu +# ubuntu sudo apt install build-essential git device-tree-compiler -# ArchLinux +# arch sudo pacman -Sy base-devel git dtc # opensuse sudo zypper in -t pattern devel_C_C++ @@ -47,23 +47,32 @@ bison 和 flex 是 gnu 提供的两个语法解析工具。 (verilator 依赖这两个工具将 verilog 代码编译成 c++ 的 class) ```sh -#opensuse +# debian/ubuntu +sudo apt install bison flex +# fedora/centos +sudo dnf install bison flex +# arch +sudo pacman -Sy bison flex +# opensuse sudo zypper in bison flex ``` ## 安装 verilator +为什么需要手动安装?使用包管理器安装 verilator 有时候并不会携带 `.cmake` 文件,导致 cmake 中 find_package 找不到 verilator + ```sh # 先 cd 到一个文件夹中,推荐 cd 到 ~/Downloads git clone https://github.com/verilator/verilator cd verilator -autoconf # Create ./configure script -./configure # Configure and create Makefile -make -j `nproc` # Build Verilator itself (if error, try just 'make') -sudo make install # 这会安装到 /usr 中 +autoconf # 生成 ./configure 文件 +./configure --prefix=$HOME/app/verilator # 配置 makefile 和安装路径 +make -j `nproc` # 多核编译 +make install # 这会安装到 /usr 中 +echo 'export PATH=$PATH:$HOME/app/verilator/bin' >> .bashrc # 追加环境变量 ``` -如果需要一些个性化,比方说安装到非`/usr`目录,或者想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html#git-quick-install +如果想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html#git-quick-install ( 因为 verilator 在编译的时候,需要使用 gnu 方言,因此推荐使用 linux ) @@ -73,7 +82,7 @@ sudo make install # 这会安装到 /usr 中 curl -s "https://get.sdkman.io" | bash ``` -安装过程中,注意看提示 +安装过程中,注意看提示,会要求在安装完成后配置环境变量 ## 安装 java @@ -87,9 +96,23 @@ sdk install java sdk install scala 2.12.13 ``` +## 安装 sbt + +sbt 是 scala 项目的构建软件 + +```sh +sdk install sbt +``` + ## 安装 gtkwave ```sh +# debian/ubuntu +sudo apt install gtkwave +# fedora/centos +sudo dnf install gtkwave +# arch/manjaro +paru gtkwave # opensuse sudo zypper in gtkwave # windows @@ -112,11 +135,204 @@ chisel 是 scala 的一个库并且目前为止并没有一个真正的 chisel I git clone https://github.com/chipsalliance/chisel-template.git ``` -然后在 vscode 中打开我们的 chisel 就行了。当然也可以用其他的 IDE (neovim is the best ide in the world!) +然后在 vscode 中打开我们的 chisel 就行了。当然也可以使用 IDEA 等。 + +经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡, 建议使用 JetBrain IDEA + +## 编写 chisel 代码 + +chisel-template 项目下天然的提供了一个 GCD 硬件 module 。 + +```scala +/// src/main/scala/gcd/GCD.scala +package gcd + +import chisel3._ +// _root_ disambiguates from package chisel3.util.circt if user imports chisel3.util._ +import _root_.circt.stage.ChiselStage + +/** + * Compute GCD using subtraction method. + * Subtracts the smaller from the larger until register y is zero. + * value in register x is then the GCD + */ +class GCD extends Module { + val io = IO(new Bundle { + val value1 = Input(UInt(16.W)) + val value2 = Input(UInt(16.W)) + val loadingValues = Input(Bool()) + val outputGCD = Output(UInt(16.W)) + val outputValid = Output(Bool()) + }) + + val x = Reg(UInt()) + val y = Reg(UInt()) + + when(x > y) { x := x - y } + .otherwise { y := y - x } + + when(io.loadingValues) { + x := io.value1 + y := io.value2 + } + + io.outputGCD := x + io.outputValid := y === 0.U +} + +/** + * Generate Verilog sources and save it in file GCD.v + */ +object GCD extends App { + ChiselStage.emitSystemVerilogFile( + new GCD, + firtoolOpts = Array("-disable-all-randomization", "-strip-debug-info") + ) +} +``` -## 调试 chisel 生成的 verilog +上面这个 `class GCD extends Module` 继承了 chisel 的 Module 抽象类。在这个类里面,我们实现了 GCD 模块。 +对应的也就是 verilog 中的 `module GCD();`。在这个 `class GCD` 中,我们描述了 GCD 的行为。 + +除了一个 `class GCD` ,下面还有一个 `object GCD` 单例。这个单例继承了 App, App 相当于是 scala 中的 `class Main`。 +`object GCD` 中,我们执行了 sv file 的发射。然后我们可以通过执行 `sbt "runMain gcd.GCD"` 运行 sv file 的发射。 +最后,我们就可以在根目录下看到对应的 GCD.sv 文件啦 + +```sv +// Generated by CIRCT firtool-1.62.0 +module GCD( + input clock, + reset, + input [15:0] io_value1, + io_value2, + input io_loadingValues, + output [15:0] io_outputGCD, + output io_outputValid +); + + reg [15:0] x; + reg [15:0] y; + always @(posedge clock) begin + if (io_loadingValues) begin + x <= io_value1; + y <= io_value2; + end + else if (x > y) + x <= x - y; + else + y <= y - x; + end // always @(posedge) + assign io_outputGCD = x; + assign io_outputValid = y == 16'h0; +endmodule +``` + +这里是 scala 语法的教程: https://docs.scala-lang.org/zh-cn/ + +## vscode 对 chisel(scala) 的支持 + +- Chisel Syntax +- Scala (Metals) +- Scala Snippets +- Scala Syntax (official) + +## 使用 verilator c++ 调试 chisel 生成的 verilog + +下面是一个 c++ 下的 testbench + +```cxx +#include "VGCD.h" +#include "verilated.h" +#include "verilated_vcd_c.h" + +#include +#include + +// 一个正确的 gcd 实现 +int gcd(uint16_t a, uint16_t b) +{ + while (b != 0) { + int remainder = a % b; + a = b; + b = remainder; + } + return a; +} + +int main(int argc, char** argv) +{ + Verilated::commandArgs(argc, argv); + Verilated::traceEverOn(true); // 启用波形跟踪 + + size_t fail_cnt = 0; + size_t success_cnt = 0; + + auto dut = std::make_unique(); + VerilatedVcdC* vcd = new VerilatedVcdC(); + dut->trace(vcd, 99); // 设定跟踪级别 + vcd->open("gcd.vcd"); // 打开VCD文件 + + // 重置设备 + dut->reset = 1; + dut->clock = 0; + for (int i = 0; i < 5; i++) { + dut->clock = !dut->clock; + dut->eval(); + vcd->dump(10 * i); // 记录时间点 + } + dut->reset = 0; + + srand(time(NULL)); + uint16_t x = rand(); + uint16_t y = rand(); + + // 主仿真循环 + for (int cycle = 0; cycle < 400; cycle++) { + dut->io_loadingValues = (cycle == 5); + dut->io_value1 = x; + dut->io_value2 = y; + + dut->clock = 1; + dut->eval(); + vcd->dump(10 * cycle + 5); + + dut->clock = 0; + dut->eval(); + vcd->dump(10 * cycle + 10); + + dut->io_loadingValues = 0; + } + + // 收集结果和清理 + uint16_t top_z = dut->io_outputGCD; + + dut->final(); + vcd->close(); // 关闭VCD文件 + + if (uint16_t z = gcd(x, y); z == top_z) { + std::cout << "success" << std::endl; + } else { + std::cout << "fail" << std::endl; + std::cout << "x: " << (int)x << std::endl; + std::cout << "y: " << (int)y << std::endl; + std::cout << "gcd(x, y): " << (int)z << std::endl; + std::cout << "dut(x, y): " << (int)top_z << std::endl; + } + + return 0; +} +``` + +### 编译 c++ 和 verilog + +```sh +verilator -Wall --cc --trace -Iobj_dir -Wno-UNUSEDSIGNAL GCD.sv --exe tb.cxx # 会生成 obj_dir 文件夹,这是将 verilog 编译成了 c++ 的 class +make -C obj_dir -f VGCD.mk +``` -可以使用 C++ 和 verilator 调试我们的 module。 +这样我们就用 verilator 编译完成了 c++ 和 verilog 。我们可以在 obj_dir 文件夹下面找到 VGCD 可执行文件。 +我们可以通过 `./VGCD` 执行可执行文件。执行完成以后,可以看到输出 `success` 字样并且在项目的根目录下生成了 `gcd.vcd` 文件。 +我们可以使用 vscode 的 wavetrace 插件(付费) 打开 `.vcd` 文件。 这是 verilator 的使用教程:https://itsembedded.com/dhd_list/ From 467398b679236f3fca57530e989cd2454f635fbc Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 15:48:41 +0800 Subject: [PATCH 03/18] :pencil: --- docs/unofficial-lab-env/comp-organ-lab2.md | 112 +++++++++++++++------ 1 file changed, 82 insertions(+), 30 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 66856b0..2c28bc3 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -1,6 +1,6 @@ # 计算机组成原理实验 2 环境指南(非官方) -以下指南适合有 linux 环境的同学使用。 +以下指南适合有 linux/mac 环境的同学使用。 笔者心态:对 verilog 感到不适,并且想折腾一些花样。 @@ -41,6 +41,8 @@ sudo zypper in -t pattern devel_C_C++ 如果配置环境过程中出现“command not found.”可能是有依赖的工具没装,此时可以利用搜索引擎。 +mac 需要安装 homebrew 作为包管理器,请查阅: https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ + ## 安装 bison 和 flex bison 和 flex 是 gnu 提供的两个语法解析工具。 @@ -55,48 +57,82 @@ sudo dnf install bison flex sudo pacman -Sy bison flex # opensuse sudo zypper in bison flex +# mac +brew install bison flex ``` ## 安装 verilator -为什么需要手动安装?使用包管理器安装 verilator 有时候并不会携带 `.cmake` 文件,导致 cmake 中 find_package 找不到 verilator +使用包管理器安装 ```sh -# 先 cd 到一个文件夹中,推荐 cd 到 ~/Downloads +# debian/ubuntu +sudo apt install verilator +# fedora/centos +sudo dnf install verilator verilator-devel +# arch +sudo pacman -Sy verilator +# mac +brew install verilator +``` + +但是有一些 linux 的发行版,他会将包拆的比较奇怪,导致没法找到 `verilated.mk` 之类的情况发生。亦或者是版本比较老,则可以使用编译安装 + +```sh +# 先 cd 到一个文件夹中,推荐 cd 到 $HOME/Downloads git clone https://github.com/verilator/verilator cd verilator autoconf # 生成 ./configure 文件 ./configure --prefix=$HOME/app/verilator # 配置 makefile 和安装路径 make -j `nproc` # 多核编译 -make install # 这会安装到 /usr 中 -echo 'export PATH=$PATH:$HOME/app/verilator/bin' >> .bashrc # 追加环境变量 +make install # 这会安装到 $HOME/app/verilator 中 +echo 'export VERILATOR_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 ``` -如果想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html#git-quick-install +如果想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html -( 因为 verilator 在编译的时候,需要使用 gnu 方言,因此推荐使用 linux ) +verilator 在编译过程中,需要用到 gnu 方言,因此推荐使用 linux。当然 mac 下的`brew install`就已经可以正常工作了。 ## 安装 sdkman +注意,并不一定要安装 sdkman 。sdkman 是一个用于管理 java 相关开发环境的软件。 +如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt ,那么实际上也不需要 sdkman。 + +```sh +# arch +paru sbt +sudo pacman -Sy openjdk +paru scala_2.12 +# fedora +sudo dnf install sbt openjdk scala-2.12 +# mac +brew install sbt openjdk scala@2.12 +``` + +注意,笔者没有查到 ubuntu/debian/opensuse/centos 可以使用包管理安装 sbt 的方式。 +因此,推荐通过 sdkman 安装 sbt 。当然,scala 和 openjdk 是可以通过包管理器安装的。 + +可以通过下面这个命令安装 + ```sh curl -s "https://get.sdkman.io" | bash ``` -安装过程中,注意看提示,会要求在安装完成后配置环境变量 +安装过程中,注意看提示,会要求在安装完成后配置环境变量。 -## 安装 java +### 使用 sdkman 安装 java ```sh sdk install java ``` -## 安装 scala 2.12.13 +### 使用 sdkman 安装 scala 2.12.13 ```sh sdk install scala 2.12.13 ``` -## 安装 sbt +### 使用 sdkman 安装 sbt sbt 是 scala 项目的构建软件 @@ -111,8 +147,8 @@ sdk install sbt sudo apt install gtkwave # fedora/centos sudo dnf install gtkwave -# arch/manjaro -paru gtkwave +# arch +sudo pacman -Sy gtkwave # opensuse sudo zypper in gtkwave # windows @@ -121,13 +157,39 @@ winget install gtkwave brew install gtkwave ``` -如果 windows/mac 作为宿主系统,应该是在 windows/mac 中安装 gtkwave,然后在 windows 打开 `.vcd` 文件。 +如果 windows/mac 作为宿主系统,应该是在 windows/mac 中安装 gtkwave,然后在 windows/mac 打开 `.vcd` 文件。 -但是 mac 实际上使用 gtkwave 会有点问题(无法双击打开)。但是可以在 shell 中 `gtkwave <.vcd>`打开。 +但是 mac 实际上使用 gtkwave 会有点兼容问题(无法双击打开)。但是可以在 shell 中 `gtkwave <.vcd>`打开。 如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) -## 创建 chisel 项目 +## chisel(scala) IDE 的选择 + +chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala ,那么自然也是支持 chisel 了。 +但是一些 IDE 如 vscode/IDEA 会对 chisel 语法有更加好的 highlight 支持。 + +经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡, 建议使用 JetBrain IDEA + +### vscode 对 chisel(scala) 的支持 + +下面是笔者使用的 vscode 插件 + +- Chisel Syntax +- Scala (Metals) +- Scala Snippets +- Scala Syntax (official) + +### vscode 对 chisel(scala) 的支持 + +下面是笔者使用的 JetBrain IDEA 插件 + +- Scala + +## example + +下面这个例子可以在:https://github.com/KINGFIOX/chisel-verilator-example 这里找到 + +### 创建 chisel 项目 chisel 是 scala 的一个库并且目前为止并没有一个真正的 chisel IDE。我们可以通过官方的 chisel-template 创建我们的项目。 @@ -135,11 +197,7 @@ chisel 是 scala 的一个库并且目前为止并没有一个真正的 chisel I git clone https://github.com/chipsalliance/chisel-template.git ``` -然后在 vscode 中打开我们的 chisel 就行了。当然也可以使用 IDEA 等。 - -经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡, 建议使用 JetBrain IDEA - -## 编写 chisel 代码 +### 编写 chisel 代码 chisel-template 项目下天然的提供了一个 GCD 硬件 module 。 @@ -227,16 +285,10 @@ module GCD( endmodule ``` -这里是 scala 语法的教程: https://docs.scala-lang.org/zh-cn/ - -## vscode 对 chisel(scala) 的支持 - -- Chisel Syntax -- Scala (Metals) -- Scala Snippets -- Scala Syntax (official) +- 这里是 scala 教程: https://docs.scala-lang.org/zh-cn/ +- 这里是 chisel 教程: https://www.chisel-lang.org/docs/cookbooks/cookbook -## 使用 verilator c++ 调试 chisel 生成的 verilog +### 使用 verilator c++ 调试 chisel 生成的 verilog 下面是一个 c++ 下的 testbench From 5a60c01937874c9935fad74c841f48b52a5f6fb7 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:03:52 +0800 Subject: [PATCH 04/18] :pencil: --- docs/unofficial-lab-env/comp-organ-lab2.md | 120 ++++++++++++++++++--- 1 file changed, 104 insertions(+), 16 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 2c28bc3..da2227a 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -41,7 +41,7 @@ sudo zypper in -t pattern devel_C_C++ 如果配置环境过程中出现“command not found.”可能是有依赖的工具没装,此时可以利用搜索引擎。 -mac 需要安装 homebrew 作为包管理器,请查阅: https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ +mac 需要安装 homebrew 作为包管理器,请查阅:https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ ## 安装 bison 和 flex @@ -95,8 +95,8 @@ verilator 在编译过程中,需要用到 gnu 方言,因此推荐使用 linu ## 安装 sdkman -注意,并不一定要安装 sdkman 。sdkman 是一个用于管理 java 相关开发环境的软件。 -如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt ,那么实际上也不需要 sdkman。 +注意,并不一定要安装 sdkman。sdkman 是一个用于管理 java 相关开发环境的软件。 +如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt,那么实际上也不需要 sdkman。 ```sh # arch @@ -110,7 +110,7 @@ brew install sbt openjdk scala@2.12 ``` 注意,笔者没有查到 ubuntu/debian/opensuse/centos 可以使用包管理安装 sbt 的方式。 -因此,推荐通过 sdkman 安装 sbt 。当然,scala 和 openjdk 是可以通过包管理器安装的。 +因此,推荐通过 sdkman 安装 sbt。当然,scala 和 openjdk 是可以通过包管理器安装的。 可以通过下面这个命令安装 @@ -153,22 +153,73 @@ sudo pacman -Sy gtkwave sudo zypper in gtkwave # windows winget install gtkwave -# mac -brew install gtkwave ``` 如果 windows/mac 作为宿主系统,应该是在 windows/mac 中安装 gtkwave,然后在 windows/mac 打开 `.vcd` 文件。 +如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) -但是 mac 实际上使用 gtkwave 会有点兼容问题(无法双击打开)。但是可以在 shell 中 `gtkwave <.vcd>`打开。 +### mac 下安装 gtkwave -如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) +mac 下安装 gtkwave 是一件非常令人感到疑惑的事情。mac 有着地狱一般的向下兼容问题。 + +通过`brew install`并不能直接安装 gtkwave, +不过可以通过`brew tap randomplum/gtkwave && brew install --HEAD randomplum/gtkwave/gtkwave`这样安装(不推荐) + +因为`randomplum/gtkwave`这个 tap 提供的 gtkwave 并支持 tcl 脚本。 + +但是我们可以使用 nix 或者 macport 安装 gtkwave(支持 tcl 脚本) + +下面两种方式选一种就行了 + +#### nix + +nixos 是一个更加强大的操作系统(有兴趣可以看看)。nixos 上有一种环境管理的工具叫做 nix, +但是 nix 作为环境管理工具现在已经支持了 linux(可以是不同于 nixos 的其他发行版) 和 mac。 + +通过这行命令安装 nix 。安装过程中请注意看提示 + +```sh +sh <(curl -L https://nixos.org/nix/install) +``` + +下面是通过 nix 安装 gtkwave 。 + +```sh +# i 表示 install +# A 表示 attr 这告诉 nix-env 通过它的属性名来选择软件包 +nix-env -iA nixpkgs.gtkwave +``` + +下面是卸载 nix 下的 gtkwave + +```sh +nix-env -e gtkwave +``` + +当然 nix 的用法远不止于此,但是就先这样用啦。 +nix 可以用的很优雅,但是这超过了本文的范围了。 + +想要卸载 nix ? 请翻阅 nix 文档: https://nixos.org + +#### macport + +macport 是 mac 上老牌的包管理器了,现在 homebrew 比较流行。 +但是 homebrew 在安装 gtkwave 上表现的并不顺利( + +在[这里](https://www.macports.org/install.php)下载 macport 并安装(注意要选择当前系统的版本) + +```sh +sudo port install gtkwave +``` + +想要卸载 macport ? 请翻阅 macport 文档: https://guide.macports.org/chunked/installing.macports.uninstalling.html ## chisel(scala) IDE 的选择 -chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala ,那么自然也是支持 chisel 了。 +chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala,那么自然也是支持 chisel 了。 但是一些 IDE 如 vscode/IDEA 会对 chisel 语法有更加好的 highlight 支持。 -经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡, 建议使用 JetBrain IDEA +经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡,建议使用 JetBrain IDEA ### vscode 对 chisel(scala) 的支持 @@ -199,7 +250,7 @@ git clone https://github.com/chipsalliance/chisel-template.git 选中信号 -> a/i -> 看波形 -> 改代码 -> make run -> 打开 gtkwave -> +选中信号 -> a/i -> 看波形 -> ... + +但是,实际上,选中信号 -> a/i 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! +实现打开 gtkwave 的时候,就将所有的信号 append/insert 到屏幕上 + +创建一个 load_all_waves.tcl 文件,写入以下内容,保存。 + +```tcl +# load_all_waves.tcl +# Add all signals +set nfacs [ gtkwave::getNumFacs ] +set all_facs [list] +for {set i 0} {$i < $nfacs } {incr i} { + set facname [ gtkwave::getFacName $i ] + lappend all_facs "$facname" +} +set num_added [ gtkwave::addSignalsFromList $all_facs ] +puts "num signals added: $num_added" + +# Zoom full +gtkwave::/Time/Zoom/Zoom_Full + +# Print +# set dumpname [ gtkwave::getDumpFileName ] +# gtkwave::/File/Print_To_File PDF {Letter (8.5" x 11")} Minimal $dumpname.pdf +``` + +然后我们可以通过下面这个命令打开`.tcl`和`.vcd` + +```sh +gtkwave -S load_all_waves.tcl gcd.vcd ``` From d86b21ba8d5794f9cc270adf39580bcea1af7571 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:05:08 +0800 Subject: [PATCH 05/18] :pencil: --- docs/unofficial-lab-env/comp-organ-lab2.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index da2227a..17a34f7 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -176,13 +176,13 @@ mac 下安装 gtkwave 是一件非常令人感到疑惑的事情。mac 有着地 nixos 是一个更加强大的操作系统(有兴趣可以看看)。nixos 上有一种环境管理的工具叫做 nix, 但是 nix 作为环境管理工具现在已经支持了 linux(可以是不同于 nixos 的其他发行版) 和 mac。 -通过这行命令安装 nix 。安装过程中请注意看提示 +通过这行命令安装 nix。安装过程中请注意看提示 ```sh sh <(curl -L https://nixos.org/nix/install) ``` -下面是通过 nix 安装 gtkwave 。 +下面是通过 nix 安装 gtkwave。 ```sh # i 表示 install @@ -199,7 +199,7 @@ nix-env -e gtkwave 当然 nix 的用法远不止于此,但是就先这样用啦。 nix 可以用的很优雅,但是这超过了本文的范围了。 -想要卸载 nix ? 请翻阅 nix 文档: https://nixos.org +想要卸载 nix?请翻阅 nix 文档:https://nixos.org #### macport @@ -212,7 +212,7 @@ macport 是 mac 上老牌的包管理器了,现在 homebrew 比较流行。 sudo port install gtkwave ``` -想要卸载 macport ? 请翻阅 macport 文档: https://guide.macports.org/chunked/installing.macports.uninstalling.html +想要卸载 macport ? 请翻阅 macport 文档:https://guide.macports.org/chunked/installing.macports.uninstalling.html ## chisel(scala) IDE 的选择 @@ -447,11 +447,11 @@ gtkwave gcd.vcd ### 使用 tcl 脚本 -每次我们使用 gtkwave 调试波形图的时候。每次打开需要一个步骤:选中信号,然后 append/insert 。 +每次我们使用 gtkwave 调试波形图的时候。每次打开需要一个步骤:选中信号,然后 append/insert。 这很不优雅。尤其是:当我们需要频繁的调试。打开 gtkwave -> 选中信号 -> a/i -> 看波形 -> 改代码 -> make run -> 打开 gtkwave -> 选中信号 -> a/i -> 看波形 -> ... -但是,实际上,选中信号 -> a/i 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! +但是,实际上,选中信号 -> a/i 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! 实现打开 gtkwave 的时候,就将所有的信号 append/insert 到屏幕上 创建一个 load_all_waves.tcl 文件,写入以下内容,保存。 From 5d810b86c7de19f0b81f306b7c679f854656bbe6 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:24:14 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=20=20=20=20=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E8=8B=B1=E6=96=87=E6=8B=BC=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 186 ++++++++++----------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 17a34f7..c6552a2 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -1,82 +1,82 @@ # 计算机组成原理实验 2 环境指南(非官方) -以下指南适合有 linux/mac 环境的同学使用。 +以下指南适合有 Linux/MacOS 环境的同学使用。 -笔者心态:对 verilog 感到不适,并且想折腾一些花样。 +笔者心态:对 Verilog 感到不适,并且想折腾一些花样。 ## 实验需要的工具 -- verilator -- chisel -- gtkwave +- Verilator +- Chisel +- GTKWave ## 安装依赖 实验工具安装需要 -- bison -- flex +- Bison +- Flex - gcc - git - g++ - java - make - sbt -- scala +- Scala - sdkman -- verilator +- Verilator 通过以下命令可以安装 ```sh -# debian/ubuntu +# Debian/Ubuntu sudo apt install build-essential git device-tree-compiler -# ubuntu +# Ubuntu sudo apt install build-essential git device-tree-compiler -# arch +# ArchLinux sudo pacman -Sy base-devel git dtc -# opensuse +# OpenSUSE sudo zypper in -t pattern devel_C_C++ ``` -如果配置环境过程中出现“command not found.”可能是有依赖的工具没装,此时可以利用搜索引擎。 +如果配置环境过程中出现 "command not found." 可能是有依赖的工具没装,此时可以利用搜索引擎。 -mac 需要安装 homebrew 作为包管理器,请查阅:https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ +MacOS 需要安装 Homebrew 作为包管理器,请查阅:https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/ -## 安装 bison 和 flex +## 安装 Bison 和 Flex -bison 和 flex 是 gnu 提供的两个语法解析工具。 -(verilator 依赖这两个工具将 verilog 代码编译成 c++ 的 class) +Bison 和 Flex 是 GNU 提供的两个语法解析工具。 +(Verilator 依赖这两个工具将 Verilog 代码编译成 C++ 的 class) ```sh -# debian/ubuntu +# Debian/Ubuntu sudo apt install bison flex -# fedora/centos +# fedora/CentOS sudo dnf install bison flex -# arch +# ArchLinux sudo pacman -Sy bison flex -# opensuse +# OpenSUSE sudo zypper in bison flex -# mac +# MacOS brew install bison flex ``` -## 安装 verilator +## 安装 Verilator 使用包管理器安装 ```sh -# debian/ubuntu -sudo apt install verilator -# fedora/centos -sudo dnf install verilator verilator-devel -# arch -sudo pacman -Sy verilator -# mac -brew install verilator +# Debian/Ubuntu +sudo apt install Verilator +# fedora/CentOS +sudo dnf install Verilator Verilator-devel +# ArchLinux +sudo pacman -Sy Verilator +# MacOS +brew install Verilator ``` -但是有一些 linux 的发行版,他会将包拆的比较奇怪,导致没法找到 `verilated.mk` 之类的情况发生。亦或者是版本比较老,则可以使用编译安装 +但是有一些 Linux 的发行版,他会将包拆的比较奇怪,导致没法找到 `verilated.mk` 之类的情况发生。亦或者是版本比较老,则可以使用编译安装 ```sh # 先 cd 到一个文件夹中,推荐 cd 到 $HOME/Downloads @@ -86,12 +86,12 @@ autoconf # 生成 ./configure 文件 ./configure --prefix=$HOME/app/verilator # 配置 makefile 和安装路径 make -j `nproc` # 多核编译 make install # 这会安装到 $HOME/app/verilator 中 -echo 'export VERILATOR_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 +echo 'export Verilator_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 ``` -如果想要其他支持,请查阅 verilator 的安装文档 https://verilator.org/guide/latest/install.html +如果想要其他支持,请查阅 Verilator 的安装文档 https://verilator.org/guide/latest/install.html -verilator 在编译过程中,需要用到 gnu 方言,因此推荐使用 linux。当然 mac 下的`brew install`就已经可以正常工作了。 +Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 linux。当然 MacOS 下的`brew install`就已经可以正常工作了。 ## 安装 sdkman @@ -99,17 +99,17 @@ verilator 在编译过程中,需要用到 gnu 方言,因此推荐使用 linu 如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt,那么实际上也不需要 sdkman。 ```sh -# arch +# ArchLinux paru sbt sudo pacman -Sy openjdk paru scala_2.12 # fedora sudo dnf install sbt openjdk scala-2.12 -# mac +# MacOS brew install sbt openjdk scala@2.12 ``` -注意,笔者没有查到 ubuntu/debian/opensuse/centos 可以使用包管理安装 sbt 的方式。 +注意,笔者没有查到 Ubuntu/Debian/OpenSUSE/CentOS 可以使用包管理安装 sbt 的方式。 因此,推荐通过 sdkman 安装 sbt。当然,scala 和 openjdk 是可以通过包管理器安装的。 可以通过下面这个命令安装 @@ -126,7 +126,7 @@ curl -s "https://get.sdkman.io" | bash sdk install java ``` -### 使用 sdkman 安装 scala 2.12.13 +### 使用 sdkman 安装 Scala 2.12.13 ```sh sdk install scala 2.12.13 @@ -134,55 +134,55 @@ sdk install scala 2.12.13 ### 使用 sdkman 安装 sbt -sbt 是 scala 项目的构建软件 +sbt 是 Scala 项目的构建软件 ```sh sdk install sbt ``` -## 安装 gtkwave +## 安装 GTKWave ```sh -# debian/ubuntu +# Debian/Ubuntu sudo apt install gtkwave -# fedora/centos +# fedora/CentOS sudo dnf install gtkwave -# arch +# ArchLinux sudo pacman -Sy gtkwave -# opensuse +# OpenSUSE sudo zypper in gtkwave # windows winget install gtkwave ``` -如果 windows/mac 作为宿主系统,应该是在 windows/mac 中安装 gtkwave,然后在 windows/mac 打开 `.vcd` 文件。 +如果 windows/MacOS 作为宿主系统,应该是在 windows/MacOS 中安装 GTKWave,然后在 windows/MacOS 打开 `.vcd` 文件。 如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) -### mac 下安装 gtkwave +### MacOS 下安装 GTKWave -mac 下安装 gtkwave 是一件非常令人感到疑惑的事情。mac 有着地狱一般的向下兼容问题。 +MacOS 下安装 GTKWave 是一件非常令人感到疑惑的事情。MacOS 有着地狱一般的向下兼容问题。 -通过`brew install`并不能直接安装 gtkwave, -不过可以通过`brew tap randomplum/gtkwave && brew install --HEAD randomplum/gtkwave/gtkwave`这样安装(不推荐) +通过`brew install`并不能直接安装 GTKWave, +不过可以通过`brew tap randomplum/gtkWave && brew install --HEAD randomplum/gtkwave/gtkwave`这样安装(不推荐) -因为`randomplum/gtkwave`这个 tap 提供的 gtkwave 并支持 tcl 脚本。 +因为`randomplum/gtkwave`这个 tap 提供的 GTKWave 并支持 tcl 脚本。 -但是我们可以使用 nix 或者 macport 安装 gtkwave(支持 tcl 脚本) +但是我们可以使用 Nix 或者 MacPort 安装 GTKWave(支持 tcl 脚本) 下面两种方式选一种就行了 -#### nix +#### Nix -nixos 是一个更加强大的操作系统(有兴趣可以看看)。nixos 上有一种环境管理的工具叫做 nix, -但是 nix 作为环境管理工具现在已经支持了 linux(可以是不同于 nixos 的其他发行版) 和 mac。 +NixOS 是一个更加强大的操作系统(有兴趣可以看看)。NixOS 上有一种环境管理的工具叫做 Nix, +但是 Nix 作为环境管理工具现在已经支持了 Linux(可以是不同于 NixOS 的其他发行版) 和 MacOS。 -通过这行命令安装 nix。安装过程中请注意看提示 +通过这行命令安装 Nix。安装过程中请注意看提示 ```sh sh <(curl -L https://nixos.org/nix/install) ``` -下面是通过 nix 安装 gtkwave。 +下面是通过 Nix 安装 GTKWave。 ```sh # i 表示 install @@ -190,38 +190,38 @@ sh <(curl -L https://nixos.org/nix/install) nix-env -iA nixpkgs.gtkwave ``` -下面是卸载 nix 下的 gtkwave +下面是卸载 Nix 下的 GTKWave ```sh nix-env -e gtkwave ``` -当然 nix 的用法远不止于此,但是就先这样用啦。 -nix 可以用的很优雅,但是这超过了本文的范围了。 +当然 Nix 的用法远不止于此,但是就先这样用啦。 +Nix 可以用的很优雅,但是这超过了本文的范围了。 -想要卸载 nix?请翻阅 nix 文档:https://nixos.org +想要卸载 Nix?请翻阅 Nix 文档:https://nixos.org -#### macport +#### MacPort -macport 是 mac 上老牌的包管理器了,现在 homebrew 比较流行。 -但是 homebrew 在安装 gtkwave 上表现的并不顺利( +MacPort 是 MacOS 上老牌的包管理器了,现在 Homebrew 比较流行。 +但是 Homebrew 在安装 GTKWave 上表现的并不顺利( -在[这里](https://www.macports.org/install.php)下载 macport 并安装(注意要选择当前系统的版本) +在[这里](https://www.MacOSports.org/install.php)下载 MacPort 并安装(注意要选择当前系统的版本) ```sh sudo port install gtkwave ``` -想要卸载 macport ? 请翻阅 macport 文档:https://guide.macports.org/chunked/installing.macports.uninstalling.html +想要卸载 MacPort ? 请翻阅 MacPort 文档:https://guide.MacOSports.org/chunked/installing.MacOSports.uninstalling.html -## chisel(scala) IDE 的选择 +## Chisel(Scala) IDE 的选择 -chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala,那么自然也是支持 chisel 了。 -但是一些 IDE 如 vscode/IDEA 会对 chisel 语法有更加好的 highlight 支持。 +Chisel 只是 Scala 中的一个库。因此,只要 IDE 能支持 Scala,那么自然也是支持 Chisel 了。 +但是一些 IDE 如 vscode/IDEA 会对 Chisel 语法有更加好的 highlight 支持。 -经观察:对于稍微大一些的 chisel 项目 (小学期级别), VSCode + Metals 会很卡,建议使用 JetBrain IDEA +经观察:对于稍微大一些的 Chisel 项目 (小学期级别), VSCode + Metals 会很卡,建议使用 JetBrain IDEA -### vscode 对 chisel(scala) 的支持 +### vscode 对 Chisel(Scala) 的支持 下面是笔者使用的 vscode 插件 @@ -230,7 +230,7 @@ chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala,那 - Scala Snippets - Scala Syntax (official) -### vscode 对 chisel(scala) 的支持 +### vscode 对 Chisel(Scala) 的支持 下面是笔者使用的 JetBrain IDEA 插件 @@ -240,15 +240,15 @@ chisel 只是 scala 中的一个库。因此,只要 IDE 能支持 scala,那 下面这个例子可以在:https://github.com/KINGFIOX/chisel-verilator-example 这里找到 -### 创建 chisel 项目 +### 创建 Chisel 项目 -chisel 是 scala 的一个库并且目前为止并没有一个真正的 chisel IDE。我们可以通过官方的 chisel-template 创建我们的项目。 +Chisel 是 Scala 的一个库并且目前为止并没有一个真正的 Chisel IDE。我们可以通过官方的 Chisel-template 创建我们的项目。 ```sh git clone https://github.com/chipsalliance/chisel-template.git ``` -### 编写 chisel 代码 +### 编写 Chisel 代码 chisel-template 项目下天然的提供了一个 GCD 硬件 module。 @@ -256,8 +256,8 @@ chisel-template 项目下天然的提供了一个 GCD 硬件 module。 /// src/main/scala/gcd/GCD.scala package gcd -import chisel3._ -// _root_ disambiguates from package chisel3.util.circt if user imports chisel3.util._ +import Chisel3._ +// _root_ disambiguates from package Chisel3.util.circt if user imports Chisel3.util._ import _root_.circt.stage.ChiselStage /** @@ -300,10 +300,10 @@ object GCD extends App { } ``` -上面这个 `class GCD extends Module` 继承了 chisel 的 Module 抽象类。在这个类里面,我们实现了 GCD 模块。 -对应的也就是 verilog 中的 `module GCD();`。在这个 `class GCD` 中,我们描述了 GCD 的行为。 +上面这个 `class GCD extends Module` 继承了 Chisel 的 Module 抽象类。在这个类里面,我们实现了 GCD 模块。 +对应的也就是 Verilog 中的 `module GCD();`。在这个 `class GCD` 中,我们描述了 GCD 的行为。 -除了一个 `class GCD` ,下面还有一个 `object GCD` 单例。这个单例继承了 App, App 相当于是 scala 中的 `class Main`。 +除了一个 `class GCD` ,下面还有一个 `object GCD` 单例。这个单例继承了 App, App 相当于是 Scala 中的 `class Main`。 `object GCD` 中,我们执行了 sv file 的发射。然后我们可以通过执行 `sbt "runMain gcd.GCD"` 运行 sv file 的发射。 最后,我们就可以在根目录下看到对应的 GCD.sv 文件啦 @@ -336,12 +336,12 @@ module GCD( endmodule ``` -- 这里是 scala 教程:https://docs.scala-lang.org/zh-cn/ -- 这里是 chisel 教程:https://www.chisel-lang.org/docs/cookbooks/cookbook +- 这里是 Scala 教程:https://docs.scala-lang.org/zh-cn/ +- 这里是 Chisel 教程:https://www.chisel-lang.org/docs/cookbooks/cookbook -### 使用 verilator c++ 调试 chisel 生成的 verilog +### 使用 Verilator C++ 调试 Chisel 生成的 Verilog -下面是一个 c++ 下的 testbench +下面是一个 C++ 下的 testbench ```cxx #include "VGCD.h" @@ -426,20 +426,20 @@ int main(int argc, char** argv) } ``` -### 编译 c++ 和 verilog +### 编译 C++ 和 Verilog ```sh -verilator -Wall --cc --trace -Iobj_dir -Wno-UNUSEDSIGNAL GCD.sv --exe tb.cxx # 会生成 obj_dir 文件夹,这是将 verilog 编译成了 c++ 的 class +verilator -Wall --cc --trace -Iobj_dir -Wno-UNUSEDSIGNAL GCD.sv --exe tb.cxx # 会生成 obj_dir 文件夹,这是将 Verilog 编译成了 C++ 的 class make -C obj_dir -f VGCD.mk ``` -这样我们就用 verilator 编译完成了 c++ 和 verilog。我们可以在 obj_dir 文件夹下面找到 VGCD 可执行文件。 +这样我们就用 Verilator 编译完成了 C++ 和 Verilog。我们可以在 obj_dir 文件夹下面找到 VGCD 可执行文件。 我们可以通过 `./VGCD` 执行可执行文件。执行完成以后,可以看到输出 `success` 字样并且在项目的根目录下生成了 `gcd.vcd` 文件。 我们可以使用 vscode 的 wavetrace 插件(付费)打开 `.vcd` 文件。 -这是 verilator 的使用教程:https://itsembedded.com/dhd_list/ +这是 Verilator 的使用教程:https://itsembedded.com/dhd_list/ -## 使用 gtkwave 打开波形仿真文件 +## 使用 GTKWave 打开波形仿真文件 ```sh gtkwave gcd.vcd @@ -447,12 +447,12 @@ gtkwave gcd.vcd ### 使用 tcl 脚本 -每次我们使用 gtkwave 调试波形图的时候。每次打开需要一个步骤:选中信号,然后 append/insert。 -这很不优雅。尤其是:当我们需要频繁的调试。打开 gtkwave -> 选中信号 -> a/i -> 看波形 -> 改代码 -> make run -> 打开 gtkwave -> +每次我们使用 GTKWave 调试波形图的时候。每次打开需要一个步骤:选中信号,然后 append/insert。 +这很不优雅。尤其是:当我们需要频繁的调试。打开 GTKWave -> 选中信号 -> a/i -> 看波形 -> 改代码 -> make run -> 打开 GTKWave -> 选中信号 -> a/i -> 看波形 -> ... 但是,实际上,选中信号 -> a/i 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! -实现打开 gtkwave 的时候,就将所有的信号 append/insert 到屏幕上 +实现打开 GTKWave 的时候,就将所有的信号 append/insert 到屏幕上 创建一个 load_all_waves.tcl 文件,写入以下内容,保存。 From 3a75b38c86a340c24373211330e89777db64b3fb Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:25:57 +0800 Subject: [PATCH 07/18] vscode -> VSCode --- docs/unofficial-lab-env/comp-organ-lab2.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index c6552a2..2671293 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -217,20 +217,20 @@ sudo port install gtkwave ## Chisel(Scala) IDE 的选择 Chisel 只是 Scala 中的一个库。因此,只要 IDE 能支持 Scala,那么自然也是支持 Chisel 了。 -但是一些 IDE 如 vscode/IDEA 会对 Chisel 语法有更加好的 highlight 支持。 +但是一些 IDE 如 VSCode/IDEA 会对 Chisel 语法有更加好的 highlight 支持。 经观察:对于稍微大一些的 Chisel 项目 (小学期级别), VSCode + Metals 会很卡,建议使用 JetBrain IDEA -### vscode 对 Chisel(Scala) 的支持 +### VSCode 对 Chisel(Scala) 的支持 -下面是笔者使用的 vscode 插件 +下面是笔者使用的 VSCode 插件 - Chisel Syntax - Scala (Metals) - Scala Snippets - Scala Syntax (official) -### vscode 对 Chisel(Scala) 的支持 +### VSCode 对 Chisel(Scala) 的支持 下面是笔者使用的 JetBrain IDEA 插件 @@ -435,7 +435,7 @@ make -C obj_dir -f VGCD.mk 这样我们就用 Verilator 编译完成了 C++ 和 Verilog。我们可以在 obj_dir 文件夹下面找到 VGCD 可执行文件。 我们可以通过 `./VGCD` 执行可执行文件。执行完成以后,可以看到输出 `success` 字样并且在项目的根目录下生成了 `gcd.vcd` 文件。 -我们可以使用 vscode 的 wavetrace 插件(付费)打开 `.vcd` 文件。 +我们可以使用 VSCode 的 wavetrace 插件(付费)打开 `.vcd` 文件。 这是 Verilator 的使用教程:https://itsembedded.com/dhd_list/ From a0654543ff5500567e4983200a20e5a58521d94a Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:27:51 +0800 Subject: [PATCH 08/18] windows -> Windows --- docs/unofficial-lab-env/comp-organ-lab2.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 2671293..ebc3683 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -91,7 +91,7 @@ echo 'export Verilator_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 如果想要其他支持,请查阅 Verilator 的安装文档 https://verilator.org/guide/latest/install.html -Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 linux。当然 MacOS 下的`brew install`就已经可以正常工作了。 +Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 Linux。当然 MacOS 下的`brew install`就已经可以正常工作了。 ## 安装 sdkman @@ -151,11 +151,11 @@ sudo dnf install gtkwave sudo pacman -Sy gtkwave # OpenSUSE sudo zypper in gtkwave -# windows +# Windows winget install gtkwave ``` -如果 windows/MacOS 作为宿主系统,应该是在 windows/MacOS 中安装 GTKWave,然后在 windows/MacOS 打开 `.vcd` 文件。 +如果 Windows/MacOS 作为宿主系统,应该是在 Windows/MacOS 中安装 GTKWave,然后在 Windows/MacOS 打开 `.vcd` 文件。 如果是 ssh 连接的 linux,可以使用 CyberDuck 或者是 MountainDuck(付费)或者是 sshfs 挂载目录,然后在 宿主机上 `gtkwave <.vcd>` 或者是双击打开。(笔者就是用的这种方式) ### MacOS 下安装 GTKWave @@ -217,7 +217,7 @@ sudo port install gtkwave ## Chisel(Scala) IDE 的选择 Chisel 只是 Scala 中的一个库。因此,只要 IDE 能支持 Scala,那么自然也是支持 Chisel 了。 -但是一些 IDE 如 VSCode/IDEA 会对 Chisel 语法有更加好的 highlight 支持。 +但是一些 IDE 如 VSCode/JetBrains IDEA 会对 Chisel 语法有更加好的 highlight 支持。 经观察:对于稍微大一些的 Chisel 项目 (小学期级别), VSCode + Metals 会很卡,建议使用 JetBrain IDEA From ce97c91b8cba43a51cc7885397e60e0cd1591a13 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:38:50 +0800 Subject: [PATCH 09/18] Verilator -> verilator --- docs/unofficial-lab-env/comp-organ-lab2.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index ebc3683..a0993c2 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -67,13 +67,13 @@ brew install bison flex ```sh # Debian/Ubuntu -sudo apt install Verilator +sudo apt install verilator # fedora/CentOS -sudo dnf install Verilator Verilator-devel +sudo dnf install verilator verilator-devel # ArchLinux -sudo pacman -Sy Verilator +sudo pacman -Sy verilator # MacOS -brew install Verilator +brew install verilator ``` 但是有一些 Linux 的发行版,他会将包拆的比较奇怪,导致没法找到 `verilated.mk` 之类的情况发生。亦或者是版本比较老,则可以使用编译安装 @@ -86,7 +86,7 @@ autoconf # 生成 ./configure 文件 ./configure --prefix=$HOME/app/verilator # 配置 makefile 和安装路径 make -j `nproc` # 多核编译 make install # 这会安装到 $HOME/app/verilator 中 -echo 'export Verilator_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 +echo 'export verilator_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 ``` 如果想要其他支持,请查阅 Verilator 的安装文档 https://verilator.org/guide/latest/install.html From 44620c637617013ca721e7103d59a8605e5290dd Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:40:44 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=20=20=20=20=E8=BF=99=E9=87=8C=EF=BC=8C?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index a0993c2..37ac7ad 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -238,7 +238,7 @@ Chisel 只是 Scala 中的一个库。因此,只要 IDE 能支持 Scala,那 ## example -下面这个例子可以在:https://github.com/KINGFIOX/chisel-verilator-example 这里找到 +下面这个例子可以在:[这里](https://github.com/KINGFIOX/chisel-verilator-example)找到 ### 创建 Chisel 项目 From c3ca51e2446fb576d358bc70677dc115ddebde8f Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:43:25 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=20=20=20=20=E5=8F=8C=E5=BC=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 37ac7ad..93c8cbe 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -451,7 +451,7 @@ gtkwave gcd.vcd 这很不优雅。尤其是:当我们需要频繁的调试。打开 GTKWave -> 选中信号 -> a/i -> 看波形 -> 改代码 -> make run -> 打开 GTKWave -> 选中信号 -> a/i -> 看波形 -> ... -但是,实际上,选中信号 -> a/i 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! +但是,实际上,"选中信号 -> a/i" 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! 实现打开 GTKWave 的时候,就将所有的信号 append/insert 到屏幕上 创建一个 load_all_waves.tcl 文件,写入以下内容,保存。 From 8d173f6ff47051e607774fa13088d1ba45fd458e Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:44:48 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=20=20=20=20=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 93c8cbe..6c35ab4 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -454,7 +454,7 @@ gtkwave gcd.vcd 但是,实际上,"选中信号 -> a/i" 这个步骤我们可以实现的更加自动化一些 —— 编写 tcl 脚本! 实现打开 GTKWave 的时候,就将所有的信号 append/insert 到屏幕上 -创建一个 load_all_waves.tcl 文件,写入以下内容,保存。 +创建一个 `load_all_waves.tcl` 文件,写入以下内容,保存。 ```tcl # load_all_waves.tcl From f8dc934fdc50eb633dcf05c0ecc4973d34018321 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:46:52 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=20=20=20=20=E8=A7=A3=E9=87=8A=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E5=90=AB=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 6c35ab4..9a82d29 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -479,5 +479,8 @@ gtkwave::/Time/Zoom/Zoom_Full 然后我们可以通过下面这个命令打开`.tcl`和`.vcd` ```sh -gtkwave -S load_all_waves.tcl gcd.vcd +# 可以通过 gtkwave -h 知道参数的含义 +# -S, --script=FILE. specify Tcl command script file for execution +# -f, --dump=FILE. specify dumpfile name +gtkwave -S load_all_waves.tcl -f gcd.vcd ``` From 98e361d886f65183e51cf3597d5cfcaaa80c547d Mon Sep 17 00:00:00 2001 From: wangfiox Date: Mon, 27 May 2024 23:47:20 +0800 Subject: [PATCH 14/18] =?UTF-8?q?=20=20=20=20=E8=A7=A3=E9=87=8A=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=90=AB=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/unofficial-lab-env/comp-organ-lab2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 9a82d29..3cbfb20 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -479,8 +479,8 @@ gtkwave::/Time/Zoom/Zoom_Full 然后我们可以通过下面这个命令打开`.tcl`和`.vcd` ```sh -# 可以通过 gtkwave -h 知道参数的含义 +# 可以通过 gtkwave -h 知道参数的含义: # -S, --script=FILE. specify Tcl command script file for execution -# -f, --dump=FILE. specify dumpfile name +# -f, --dump=FILE. specify dumpfile name gtkwave -S load_all_waves.tcl -f gcd.vcd ``` From 6224432182d8ea7e8cf81f03ae26c1766e3defd2 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Tue, 28 May 2024 00:05:24 +0800 Subject: [PATCH 15/18] fedora -> Fedora --- docs/unofficial-lab-env/comp-organ-lab2.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 3cbfb20..8f2ba69 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -51,7 +51,7 @@ Bison 和 Flex 是 GNU 提供的两个语法解析工具。 ```sh # Debian/Ubuntu sudo apt install bison flex -# fedora/CentOS +# Fedora/CentOS sudo dnf install bison flex # ArchLinux sudo pacman -Sy bison flex @@ -68,7 +68,7 @@ brew install bison flex ```sh # Debian/Ubuntu sudo apt install verilator -# fedora/CentOS +# Fedora/CentOS sudo dnf install verilator verilator-devel # ArchLinux sudo pacman -Sy verilator @@ -103,7 +103,7 @@ Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 Linu paru sbt sudo pacman -Sy openjdk paru scala_2.12 -# fedora +# Fedora sudo dnf install sbt openjdk scala-2.12 # MacOS brew install sbt openjdk scala@2.12 @@ -145,7 +145,7 @@ sdk install sbt ```sh # Debian/Ubuntu sudo apt install gtkwave -# fedora/CentOS +# Fedora/CentOS sudo dnf install gtkwave # ArchLinux sudo pacman -Sy gtkwave From f470b5160340888285ec0737d3ae1bbeddc2afd4 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Tue, 28 May 2024 00:07:52 +0800 Subject: [PATCH 16/18] sdkman -> SDKMAN --- docs/unofficial-lab-env/comp-organ-lab2.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index 8f2ba69..eceb29d 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -23,7 +23,7 @@ - make - sbt - Scala -- sdkman +- SDKMAN - Verilator 通过以下命令可以安装 @@ -93,10 +93,10 @@ echo 'export verilator_ROOT=$HOME/app/verilator' >> .bashrc # 追加环境变量 Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 Linux。当然 MacOS 下的`brew install`就已经可以正常工作了。 -## 安装 sdkman +## 安装 SDKMAN -注意,并不一定要安装 sdkman。sdkman 是一个用于管理 java 相关开发环境的软件。 -如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt,那么实际上也不需要 sdkman。 +注意,并不一定要安装 SDKMAN。SDKMAN 是一个用于管理 java 相关开发环境的软件。 +如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt,那么实际上也不需要 SDKMAN。 ```sh # ArchLinux @@ -110,7 +110,7 @@ brew install sbt openjdk scala@2.12 ``` 注意,笔者没有查到 Ubuntu/Debian/OpenSUSE/CentOS 可以使用包管理安装 sbt 的方式。 -因此,推荐通过 sdkman 安装 sbt。当然,scala 和 openjdk 是可以通过包管理器安装的。 +因此,推荐通过 SDKMAN 安装 sbt。当然,scala 和 openjdk 是可以通过包管理器安装的。 可以通过下面这个命令安装 @@ -120,19 +120,19 @@ curl -s "https://get.sdkman.io" | bash 安装过程中,注意看提示,会要求在安装完成后配置环境变量。 -### 使用 sdkman 安装 java +### 使用 SDKMAN 安装 java ```sh sdk install java ``` -### 使用 sdkman 安装 Scala 2.12.13 +### 使用 SDKMAN 安装 Scala 2.12.13 ```sh sdk install scala 2.12.13 ``` -### 使用 sdkman 安装 sbt +### 使用 SDKMAN 安装 sbt sbt 是 Scala 项目的构建软件 From 95ee2c59957f1767ad663f933723ff639d75d756 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Tue, 28 May 2024 00:09:30 +0800 Subject: [PATCH 17/18] java -> Java --- docs/unofficial-lab-env/comp-organ-lab2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/unofficial-lab-env/comp-organ-lab2.md b/docs/unofficial-lab-env/comp-organ-lab2.md index eceb29d..e0db580 100644 --- a/docs/unofficial-lab-env/comp-organ-lab2.md +++ b/docs/unofficial-lab-env/comp-organ-lab2.md @@ -19,7 +19,7 @@ - gcc - git - g++ -- java +- Java - make - sbt - Scala @@ -95,7 +95,7 @@ Verilator 在编译过程中,需要用到 GNU 方言,因此推荐使用 Linu ## 安装 SDKMAN -注意,并不一定要安装 SDKMAN。SDKMAN 是一个用于管理 java 相关开发环境的软件。 +注意,并不一定要安装 SDKMAN。SDKMAN 是一个用于管理 Java' 相关开发环境的软件。 如果我们发行版的包管理器可以顺利安装 java, scala@2.12.13, sbt,那么实际上也不需要 SDKMAN。 ```sh @@ -120,7 +120,7 @@ curl -s "https://get.sdkman.io" | bash 安装过程中,注意看提示,会要求在安装完成后配置环境变量。 -### 使用 SDKMAN 安装 java +### 使用 SDKMAN 安装 Java ```sh sdk install java From 0f107b845927bb4a4b1afa54952340b316388bf4 Mon Sep 17 00:00:00 2001 From: wangfiox Date: Tue, 28 May 2024 00:20:36 +0800 Subject: [PATCH 18/18] modified: mkdocs.yml --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index e8a5b28..e40d49c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -87,6 +87,7 @@ nav: - PyTorch on SLURM: hpc-doc/pytorch.md - 非官方实验环境指南: - 计算机组成原理lab1: unofficial-lab-env/comp-organ-lab1.md + - 计算机组成原理lab2: unofficial-lab-env/comp-organ-lab2.md plugins: - search: