哈尔滨工业大学 于鸿利 22040866
预学习阶段
如何科学的提问
见读后感
Linux系统安装和基本使用
安装一个linux操作系统
复用了wsl2-ubantu20.04
首先将windows版本更新到build 21362+(win11即可),然后以管理员权限打开命令行
输入wsl –update即可将已有的windows subsystem for linux更新到带有图形用户界面的版本
获取一生一芯框架代码
添加ssh密钥
按照讲义clone一个本地项目即可
复习C语言
*
搭建verilator仿真环境
认识verilator
开源的数字电路仿真软件
安装verilator
make install编译了十几分钟啧啧啧
运行示例
按照手册中的说明编写了our.v, sim_main.cpp,编译并运行了程序
1
verilator -Wall --cc --exe --build sim_main.cpp our.v
结果是这样的
1
2Hello World
our.v:2: Verilog $finish对双控开关模块进行仿真
具体而言,需要调整的内容有:
.v文件名要修改为top.v
cpp 文件中要引入头文件
cpp 文件中
1
Vour* top = new Vour{contextp};
的类名要改为Vour
编译语句中的文件名要做相应的更改
结果是这样的
1
2
3
4
5
6
7a = 0, b = 1, f = 1
a = 1, b = 0, f = 1
a = 0, b = 0, f = 0
a = 0, b = 1, f = 1
a = 0, b = 1, f = 1
a = 0, b = 1, f = 1
^C
理解RTL仿真的行为
一键仿真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55#生成的可执行文件名称
TOPNAME = top
#在指定文件夹中按扩展名查找所有源文件
VSRC = $(shell find $(abspath ./vsrc) -name "*.v")
CSRC = $(shell find $(abspath ./csrc) -name "*.c" -or -name "*.cc" -or -name "*.cpp")
#nvbroad自动绑定源文件,注意,如果没有$(BUILD_DIR)目录,将无法正确的生成该文件
SRC_AUTO_BIND = $(abspath $(BUILD_DIR)/auto_bind.cpp)
CSRC += $(SRC_AUTO_BIND)
#nvbroad约束文件
CONSTR = constr/top.nxdc
#构建目录、verilator目标目录、可执行文件存放路径
BUILD_DIR = ./build
OBJ_DIR = $(BUILD_DIR)/obj_dir
BIN = $(BUILD_DIR)/$(TOPNAME)
#传递给verilator的参数:以c++形式输出调试信息,并自动依据makefile进行构建
VERIARG = -Wall --cc -MMD --build
#传递给preproject连接器的信息,添加SDL2库信息
LDFLAGS += -lSDL2 -lSDL2_image
#包含文件路径,加前缀-I传递给g++,INC_PATH在nvbroad.mk中定义
INCFLAGS = $(addprefix -I, $(INC_PATH))
#传递给g++的编译参数,包括包含路径和TOP_NAME的定义
CFLAGS += $(INCFLAGS) -DTOP_NAME="\"V$(TOPNAME)\""
#包含nvbroad.mk
include $(NVBOARD_HOME)/scripts/nvboard.mk
#新建构建目录,防止出现无法新建autobind.cpp的错误
$(shell mkdir -p $(BUILD_DIR))
#默认的构建对象
sim: $(CSRC) $(VSRC) $(NVBOARD_ARCHIVE)
#提交当前存储区,提交信息为sim RTL
$(call git_commit, "sim RTL") # DO NOT REMOVE THIS LINE!!!
#运行verilator,传递给其编译参数
#指定top模块名称
#添加所有源文件和nvbroad库
#传递所有preproject连接器参数,加前缀
#传递所有编译器参数,加前缀
#指定生成对象目录,生成可执行文件,输出路径为预先指定的可执行文件存储路径
verilator $(VERIARG) \
-top $(TOPNAME) \
$^ \
$(addprefix -LDFLAGS , $(LDFLAGS)) \
$(addprefix -CFLAGS , $(CFLAGS)) \
--Mdir $(OBJ_DIR) --exe -o $(abspath $(BIN))
#自动绑定文件,由于其被可执行文件依赖,会先生成该文件。调用python执行nvbroad自带的.py文件,输入约束文件,输出自动绑定文件
$(SRC_AUTO_BIND): $(CONSTR)
python3 $(NVBOARD_HOME)/scripts/auto_pin_bind.py $^ $@运行NVBoard示例
看到了一组循环显示数字的数码管,还有南京大学的 “北 大楼”(南大的高中同学告诉我的)
在NVBoard上实现双控开关
我使用如下的代码来完成引脚绑定:
1 | top=top |
配合如下激励代码来连接面板
1 | nvboard_bind_all_pins(&dut); |
数字电路基础实验
实验一 选择器
- 上板实验: 二位四选一选择器
我使用如下的代码来搭建top模块:
1 | module top(a,s,y); |
可以看到, 双输出的选择器要改变a和y的位宽,调整模板的参数,并且对default output的位宽和键值对的输出值的位宽做相应的调整
我使用如下的代码来完成引脚绑定:
1 | top=top //设置TOP_NAME为top |
这里按照实验的建议用开关作为输入,led灯作为输出
我使用如下的代码来完成激励代码的主体部分:
1 | static TOP_NAME dut;//nvbroad接口,宏自动展开为Vtop |
更新值并且更新版面图像即可,我已经看过了,非常漂亮.:>
实验二 编码器和译码器
c源文件无需更改
verilog文件包含两个模块,数码管模块和编码器模块:
1 | /*top.v*/ |
1 | /*seg.v*/ |
约束文件的绑定是这样的:
1 | top=top//指定top接口名称 |
第三章 加法器和ALU
首先通过约束文件介绍一下整体功能
1 | top=top |
seg模块复用了之前的模块,但是做了些许调整,以显示9,负号和空:
1 | /*seg.v*/ |
接下来是alu的主体部分:
1 | /*top.v*/ |
接下来是按钮控制模块,相当于有多个触发条件和触发行为的触发器:
1 | module button( |
总体而言,按中间的按钮会执行当前指令的运算,然后可以调节开关,观察结果.如果按上下左右四个按钮,会看到指令码变化,结果消失,需要重新按一次中间的按钮才会出现结果(就好像计算器的”等于”键)
实验五 寄存器组以及存储器
分析三个输出端口的存储器实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18always @(posedge clk)
begin
if (we)
ram[inaddr] <= din;
else
/*dout0在不进行写入的上升沿读取*/
dout0 <= ram[outaddr];
end
always @(negedge clk)
begin
/*dout1在没有写使能的下降沿读取*/
if (!we)
dout1 <= ram[outaddr];
end
/*dout2永远直接读取输出信号*/
assign dout2 = ram[outaddr];完成PA1第一阶段
1. 开天辟地的篇章
尝试理解计算机如何计算
取指执行,以跳转实现控制流,以内存和寄存器实现变量
从状态机视角理解程序运行
先把程序写出来:
1 | // PC: instruction | // label: statement |
然后是开头:
1 | (0, x, x) -> (1, 0, x) -> (2, 0, 0) -> (3, 0, 1) |
接下来的状态是:
1 | (4, 1, 1) -> (2, 1, 1) -> (3, 1, 2) -> (4, 3, 2) -> (2, 3, 2) -> (3, 3, 3) -> (4, 3, 4)->... |