tiny riscv - RTL验证+RISCV汇编语言

451 阅读2分钟

iverilog

Icarus Verilog是一个verilog仿真工具. 以编译器的形式工作, 将以verilog编写的源代码编译为某种目标格式. 如果要进行仿真的话, 它可以生成一个叫做vvp的中间格式. 这个格式可以由其所附带的vvp命令执行.

安装文件中已经包含 GTKWave支持Verilog/VHDL文件的编译和仿真,命令行操作方式,类似gcc编译器,通过testbench文件可以生成对应的仿真波形数据文件,通过自带的GTKWave可以查看仿真波形图,支持将Verilog转换为VHDL文件。

gtkwave

GTKWave是一个开源的波形文件察看工具,支持Verilog VCD/EVCD文件格式。

过程

1 iverilog编译仿真测试程序为一个 vvp文件

2 使用vvp工具,vvp counter_tb.vvp vvp开始仿真。生成vcd文件

3 通过gtkwave查看vcd文件

testbench

//读指令,将instdata中的指令读入rom
initial begin
    $readmemh ("inst.data", tinyriscv_soc_top_0.u_rom._rom);
end


//记录信号值变化
initial begin
    $dumpfile("tinyriscv_soc_tb.vcd");
    $dumpvars(0, tinyriscv_soc_tb);
end


Verilog提供一系列系统任务用于记录信号值变化,常见的格式有vcd,fsdb等。

$dumpfile("file. dump"); 打开一个VCD数据库用于记录

$dumpvars(level,start_module); 要记录的信号,level=0表示记录所有.

RISCV汇编语言

汇编语言作为连接底层软件和处理器硬件(数字逻辑)的桥梁。

RV32I有32个通用寄存器(x0至x31),PC寄存器不在这32个寄存器里面,其中x0为只读寄存器,其值固定为0。

在RISC-V汇编语言程序里,我们一般看到的不是x0、x1、x2等这些名字,而是zero、ra、sp等名字,是因为这里的x0至x31有其对应的ABI(application
binary interface)名字。

image.png

image.png

下面是一些常用的RISC-V整数指令。

1.lui指令

语法:lui rd, imm,作用是将imm的低12位置0,结果写入rd寄存器。

2.auipc指令

语法:auipc rd, imm,作用是将imm的高20位左移12位,低12位置0,然后加上PC的值,结果写入rd寄存器。

3.jal指令

语法:jal rd, offset或者jal offset,作用是将PC的值加上4,结果写入rd寄存器,rd默认为x1,同时将PC的值加上offset。

4.jalr指令

语法:jalr rd, rs1或者jalr rs1,作用是将PC的值加上4,结果写入rd寄存器,rd默认为x1,同时将PC的值加上符号位扩展之后的rs1的值。

5.beq指令

语法:beq rs1, rs2, offset,作用是如果rs1的值等于rs2的值,则将PC设置为符号位扩展后的offset的值。

6.bne指令

语法:bne rs1, rs2, offset,作用是如果rs1的值不等于rs2的值,则将PC设置为符号位扩展后的offset的值。