tinyriscv的学习(1)

1.标准DFF模块的编写
2.assign语法替代if-else和case语法、
以上两条参见手把手教你设计CPU的p70页。
3.用always描述组合逻辑电路时要注意避免产生锁存器,if和case的分支情况要写全。
4.在tinyriscv中用了大量的always来描述组合逻辑电路,特别是在译码和执行阶段。

在这里插入图片描述
5.寄存器采用的是异步读方式

PC寄存器模块:
1.采用的是上升沿时钟方式,是什么意思?好像引用的变量都不在本文件内,类似于宏定义。`include “defines.v”
2.tinyriscv的取值地址是4字节对齐,每条指令是32位 eg:4’h4

// 写寄存器
    always @ (posedge clk) begin
        if (rst == `RstDisable) begin
            // 优先ex模块写操作
            if ((we_i == `WriteEnable) && (waddr_i != `ZeroReg)) begin
                regs[waddr_i] <= wdata_i;//好奇这里是取32个寄存器中的任意一个,然后把数据传给该寄存器吗?
            end else if ((jtag_we_i == `WriteEnable) && (jtag_addr_i != `ZeroReg)) begin
                regs[jtag_addr_i] <= jtag_data_i;
            end
        end
    end
// 读寄存器1
    always @ (*) begin//敏感列表变化,异步
        if (raddr1_i == `ZeroReg) begin
            rdata1_o = `ZeroWord;
        // 如果读地址等于写地址,并且正在写操作,则直接返回写数据
        end else if (raddr1_i == waddr_i && we_i == `WriteEnable) begin
            rdata1_o = wdata_i;
        end else begin
            rdata1_o = regs[raddr1_i];
        end
    end

`define RegNumLog2 5 5位可以表示32个寄存器

前递或旁路的概念。
以冒号和空格为分界,第一部分是该指令所在的程序在内存中的地址,即PC。第二部分是该指令的指令码,第三部分是指令的具体内容,即汇编指令。
指令码和具体的指令是一一对应的关系,不存在两条指令对应同一个指令码的情况,也不存在一个指令有两种指令码的情况。当然,某些伪指令由设计者自定义,因此会存在不同指令码对应某一个伪指令的情况,但是不属于上述讨论情形。
模块:
if_id 时序电路
译码id :纯组合逻辑电路。
加载指令:lb lh lw ld lbu lhu lwu

在这里插入图片描述

INST_TYPE_I 包括:
// I type inst

`define INST_TYPE_I 7'b0010011
`define INST_ADDI   3'b000
`define INST_SLTI   3'b010
`define INST_SLTIU  3'b011
`define INST_XORI   3'b100
`define INST_ORI    3'b110
`define INST_ANDI   3'b111
`define INST_SLLI   3'b001
`define INST_SRI    3'b101

2022.1.18
SRI指令又分为SRLI和SRAI 其中SRLI的rs2寄存器设为shamt funct7为0000000 SRAI的rs2寄存器设为shamt funct7为0100000 SLLI指令除了funct3与SRLI不同外,funct7和其余区域设置相同。

// R and M type inst
`define INST_TYPE_R_M 7'b0110011
// R type inst
`define INST_ADD_SUB 3'b000
`define INST_SLL    3'b001
`define INST_SLT    3'b010
`define INST_SLTU   3'b011
`define INST_XOR    3'b100
`define INST_SR     3'b101
`define INST_OR     3'b110
`define INST_AND    3'b111

其中ADD和SUB指令funt3是相同的,具体看funct7,ADD为0000000而SUB为0100000 SRL和SRA统称为SR, SRL的funct7为0000000, SRA的funct7为0100000.
下面的代码用if语句将funct7不同的指令包括在内了。

`INST_TYPE_R_M: begin
                if ((funct7 == 7'b0000000) || (funct7 == 7'b0100000)) begin
                    case (funct3)
                        `INST_ADD_SUB, `INST_SLL, `INST_SLT, `INST_SLTU, `INST_XOR, `INST_SR, `INST_OR, `INST_AND: begin
                            reg_we_o = `WriteEnable;
                            reg_waddr_o = rd;
                            reg1_raddr_o = rs1;
                            reg2_raddr_o = rs2;
                            op1_o = reg1_rdata_i;
                            op2_o = reg2_rdata_i;
                        end
                        default: begin
                            reg_we_o = `WriteDisable;
                            reg_waddr_o = `ZeroReg;
                            reg1_raddr_o = `ZeroReg;
                            reg2_raddr_o = `ZeroReg;
                        end
                    endcase
                end               

运行旧的指令测试程序:
1.\和/的区别,Window下为\,Linux下为/。
2.对应的软链接 python2和python3 先重新建立软链接 删除原软链接rm /usr/bin/python,重新装的时候确定好python3在那个位置 相应的链接命令 ln -s /usr/local/
3.python 退出命令exit()
4运行测试后会生成.vcd文件 可以用gtkwave打开 先insert相应的变量,如clk,pc,inst_i等等 再fit
可以从文件夹中找到inst,data文件是与inst_i变量相对应的
5.Linux终端输入小技巧,当输入了一节时候,按下Tab键,会将剩下路径补齐。
6…bin文件为二进制文件。
7.测试只是测试指令集是否正确,并非测试整个处理器是否ok,也就是并非是一个完备的测试。
8.新的指令测试程序 更加严谨
9.运行C语言的程序(一般用来做嵌入式开发,C语言编写,烧写在芯片,处理器上,做嵌入式开发 ,ZYNQ)
10.编译命令 make
11工具链的修改,需要确认与安装工具链对应的上 使用vim common.mk打开 把GNU文件夹的名字替换到common.mk中去 。 vim为一个编译工具 gvim , vim工具 批量修
改命令: 放好光标 按住V 按J往下移动,批量选中。然后输入: :riscv-none-embed/riscv64-unknown-elf/g 在输入:wq保存退出 将GNU工具链的配置完成
12.o编译过程中产生的中间文件,得到了simple.bin这个可以在riscv上运行的程序.
13.cd …回到上一级
14.fpga的讲解 放在第三期
15.如果是为了处理器的设计学习,重点放在rtl/core这个文件夹中,这里面就是整个riscv处理器的设计。
16.讲解测试的过程是z怎么实现的,找到Sim文件,找到python脚本即尾缀为.py的文件,打开sim_new_nowave.py文件,第一步是将bin文件转成mem文件,mem指代的其实就是inst.data文件
inst.data文件中 指令的输入 8个16进制 32位的处理器 第二步编译了rtl文件 ,找到compile.trl文件,打开以后可以看得到 添加了testbench的路径,iverilog也被调用了,可以看到x26 x27寄存器位1时候 ,开始打印pass,想弄清楚为什么是x26和x27就需要读懂指令集。
进入root模式
:
该图就是一个测试的实现过程。
在这里插入图片描述
https://lab.cs.tsinghua.edu.cn/cod-lab-docs/ 实验课 里面含有单周期和五级流水线

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值