0%

CPU设计01-verilog开发调试

本文将初步介绍verilog的vscode开发环境准备;后续开发测试皆以这个环境为主,数字电路相比高频电路的难点在于不断堆叠基础单元带来的复杂性,所以单元测试就非常重要.另外要说明的是此后数字电路部分的笔记,是我从最基础的硬件设计语言,到CPU的RTL设计,再到SoC的完整制版的一个记录过程,最初的设想的是做一个可以运行的软核的CPU,但没有想到的是扩展的内容越来越多.

1. 环境部署

环境部署的内容可以参考这篇文章;熟悉verilog语法,我的建议是下载[VerilogHDL数字设计与综合]这本书精读,从电路本身实现转变到用verilog实现,会在硬件电路设计上走的更远;这里再次附带verilog的安装链接主页;另外确认自己vscode的相关插件都已安装好!!!

2. 工程界面

工程目录包括build,src和根目录下的build.sh脚本,src主要是放源码,build存放生成的文件.

3. 工程举例

3.1 编译脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# build.sh
work=$(pwd)
build=${work}/build
src=${work}/src

rm -rf ${build}
mkdir -p ${build}

source_module=$1
testbentch_module=${source_module}_tb

# 主要的编译过程
cd ${build}
# 安装iverilog
iverilog -o "${testbentch_module}.vvp" ${src}/${testbentch_module}.v \
${src}/${source_module}.v
vvp -n "${testbentch_module}.vvp"

cd ${work}

3.2 计数器代码注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 这是一个8位的计数器counter.v
module counter(out, clk, enable,reset);
output[7:0] out;
input clk, reset, enable;
reg[7:0] out;
// clk上升沿触发
always @ (posedge clk) begin
if(reset) begin
// 如果reset为true
// 8'b0是8位宽,b代表二进制的0
out <= 8'b0;
end else if(enable) begin
// 如果enbale为true
// out增加1
out <= out + 1;
end
end
endmodule
3.3 测试用例注释
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
`timescale 1ns/1ns
module counter_tb;
reg clk, enable, reset;
wire [7:0] out;
// 实例化计数器c1
counter c1(.out(out), .clk(clk), .enable(enable), .reset(reset));
initial begin
// 默认初始化enable为1(高电平)
enable = 1;
end
initial begin
clk = 0;
// 这里为每10ns翻转一次,ns单位是代码最上方那个决定的
forever #10 clk = ~clk;
end
initial begin
reset = 1;
// reset在15ns以后为0
#15 reset = 0;
// 500ns后结束;$finish是verilog的一个"内置函数"
#500 $finish;
end
initial
begin
$dumpfile("counter_tb.vcd"); //生成的vcd文件名称
$dumpvars(0, counter_tb); //tb模块名称
end
endmodule
3.4 波形分析

对应3.3测试用例代码解释:

  • 第一行是时钟波形,每10ns翻转一次
  • 第二行为许可信号,从一开始就为1(高电平)
  • 第三行为重置信号,在15ns后为0(低电平)
  • 第四行为结果输出,在时钟上升沿时,计数器值增加1
    直到第500ns秒结束.