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)名字。
下面是一些常用的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的值。