【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境

news2024/11/15 14:08:25

【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境

文章目录

  • 【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境
    • 1.简介
    • 2.验证顶层
    • 3.顶层代码
    • 4.模型结构
      • 4.1 地址映射
      • 4.2 特殊功能寄存器
    • 5.模型代码
    • 6.运行脚本
    • 7.总结

1.简介

在前几篇文章中,分别介绍了各个模块的设计,本篇文章将会针对k0a_core_top层搭建一个简单的验证环境。

2.验证顶层

3.顶层代码

// -------------------------------------------------------------------------------------------------
// Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
// Description :
//             1. testbench for simulation
// -------------------------------------------------------------------------------------------------

`timescale 1ns/10ps

module test_top();

reg          core_clk    ;
reg          core_rstn   ;

wire         bus_avalid  ;
wire         bus_aready  ;
wire         bus_write   ;
wire [17:0]  bus_addr    ;
wire [3:0]   bus_strb    ;
wire [31:0]  bus_wdata   ;
wire         bus_rvalid  ;
wire         bus_rready  ;
wire [31:0]  bus_rdata   ;

reg  [15:0]  irq_lines   ;

k0a_core_top dut (
    .core_clk       (core_clk       ),
    .core_rstn      (core_rstn      ),
    .bus_avalid     (bus_avalid     ),
    .bus_aready     (bus_aready     ),
    .bus_write      (bus_write      ),
    .bus_addr       (bus_addr       ),
    .bus_strb       (bus_strb       ),
    .bus_wdata      (bus_wdata      ),
    .bus_rvalid     (bus_rvalid     ),
    .bus_rready     (bus_rready     ),
    .bus_rdata      (bus_rdata      ),
    .irq_lines      (irq_lines      )
);

slave_model u_slave (
    .clk            (core_clk       ),
    .rstn           (core_rstn      ),
    .avalid         (bus_avalid     ),
    .aready         (bus_aready     ),
    .write          (bus_write      ),
    .addr           (bus_addr       ),
    .strb           (bus_strb       ),
    .wdata          (bus_wdata      ),
    .rvalid         (bus_rvalid     ),
    .rready         (bus_rready     ),
    .rdata          (bus_rdata      )
);

initial begin
    core_clk = 1'b0;
    forever #10 core_clk = ~core_clk;
end

initial begin
    core_rstn = 1'b0;
    irq_lines = 16'd0;
    initcase();
    #1000;
    core_rstn = 1'b1;
    testcase();
    $finish();
end

`ifdef DUMP_LXT2

initial begin
    $dumpfile("test_top.lxt2");
    $dumpvars(0, test_top);
end

`endif

`include "testcase.v"

task load_instr(string path);

    integer i, fd, ret;
    reg [7:0] data;

    fd = $fopen($sformatf("../test/%s", path), "rb");

    if(fd == 0) begin
        $display("Open file : ../test/%s failed!", path);
    end

    for(i=0; i<131072; i++) begin
        u_slave.imem[i] = 32'd0;
    end

    i = 0;
    while($feof(fd) == 0) begin
        ret = $fread(data, fd);
        u_slave.imem[i/4][(i%4)*8+:8] = data;
        i++;
    end

    $fclose(fd);

endtask

endmodule

在测试顶层代码中,连接了DUT的时钟、复位以及中断信号,总线的丛机模型和内核相连接。同时,提供了一个加载初始化软件代码的任务,验证用例通过load_instr任务,可加载二进制Bin文件到丛机模型中,在复位结束后,内核开始运行软件代码。

4.模型结构

4.1 地址映射

4.2 特殊功能寄存器

地址寄存器位宽属性描述
0xC0000DATA8WO队列的地址,软件可通过向此地址写入ASCII字符,输出到终端显示,以换行符\n结尾
0xC0004FINISH32WO写入数据0x12345678后,仿真运行结束
0xC0008CLOCK32RO时钟计数器,在复位结束后开始每个时钟周期自增1
0xC000CSPEED8RW模型的总线速度,0:模型会随机拉住总线的ready,1:总线ready一直为1

5.模型代码

// -------------------------------------------------------------------------------------------------
// Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
// Description :
//             1. slave model for simulation
// -------------------------------------------------------------------------------------------------

module slave_model (
    input  wire         clk    ,
    input  wire         rstn   ,
    input  wire         avalid ,
    output wire         aready ,
    input  wire         write  ,
    input  wire [17:0]  addr   ,
    input  wire [3:0]   strb   ,
    input  wire [31:0]  wdata  ,
    output wire         rvalid ,
    input  wire         rready ,
    output wire [31:0]  rdata
);

reg         flag;
reg  [1:0]  cycle;
reg  [31:0] dout;

reg  [31:0] imem[0:131071];
reg  [31:0] dmem[0:65535];

reg  [7:0]  queue[$];

reg  [31:0] clock;
reg         speed;

string      str;

integer     idx;

assign aready = cycle == 3'd0 ? 1'b1 : 1'b0;
assign rvalid = cycle == 3'd0 ? flag : 1'b0;
assign rdata  = cycle == 3'd0 ? dout : 32'dx;

always @(posedge clk)
begin
    if(avalid & aready & write) begin
        if(~addr[17]) begin
            if(strb[0]) imem[addr[16:0]][0 +:8] <= wdata[0 +:8];
            if(strb[1]) imem[addr[16:0]][8 +:8] <= wdata[8 +:8];
            if(strb[2]) imem[addr[16:0]][16+:8] <= wdata[16+:8];
            if(strb[3]) imem[addr[16:0]][24+:8] <= wdata[24+:8];
        end else if(~addr[16]) begin
            if(strb[0]) dmem[addr[15:0]][0 +:8] <= wdata[0 +:8];
            if(strb[1]) dmem[addr[15:0]][8 +:8] <= wdata[8 +:8];
            if(strb[2]) dmem[addr[15:0]][16+:8] <= wdata[16+:8];
            if(strb[3]) dmem[addr[15:0]][24+:8] <= wdata[24+:8];
        end
    end
end

always @(posedge clk or negedge rstn)
begin
    if(!rstn)
        flag <= 1'b0;
    else if(avalid & aready & ~write)
        flag <= 1'b1;
    else if(rready & rvalid)
        flag <= 1'b0;
end

always @(posedge clk or negedge rstn)
begin
    if(!rstn)
        cycle <= 2'd0;
    else if(|cycle)
        cycle <= cycle - 2'd1;
    else if(avalid) begin
        idx = $urandom_range(0, 99);
        if(idx <= 80 || speed == 1'b1)
            cycle <= 2'd0;
        else if(idx <= 95)
            cycle <= 2'd1;
        else if(idx <= 97)
            cycle <= 2'd2;
        else
            cycle <= 2'd3;
    end
end

always @(posedge clk or negedge rstn)
begin
    if(!rstn)
        dout <= 32'dx;
    else if(avalid & aready & ~write)
        if(~addr[17])
            dout <= imem[addr[16:0]];
        else if(~addr[16])
            dout <= dmem[addr[15:0]];
        else if(addr[15:0] == 16'h0002)
            dout <= clock;
        else if(addr[15:0] == 16'h0003)
            dout <= {31'd0, speed};
    else if(rready & rvalid)
        dout <= 32'dx;
end

always @(posedge clk)
begin
    if(avalid & aready & write & strb[0] & addr == 18'h30000) begin
        if(wdata[7:0] == 8'h0a) begin
            str = "";
            while(queue.size() > 0) begin
                str = $sformatf("%s%c", str, queue.pop_front());
            end
            $display("[MCU_INFO] : %s", str);
        end else begin
            queue.push_back(wdata[7:0]);
        end
    end
end

always @(posedge clk)
begin
    if(avalid & aready & write & (&strb) & addr == 18'h30001) begin
        if(wdata == 32'h12345678) begin
            $finish();
        end
    end
end

always @(posedge clk or negedge rstn)
begin
    if(!rstn)
        clock <= 32'd0;
    else
        clock <= clock + 1'b1;
end

always @(posedge clk or negedge rstn)
begin
    if(!rstn)
        speed <= 1'b0;
    else if(avalid & aready & write & strb[0] & addr == 18'h30003)
        speed <= wdata[0];
end

endmodule

6.运行脚本

脚本支持两套仿真工具,一套为开源的iverilog+gtkwave的组合,另一套为vcs+verdi。

# -------------------------------------------------------------------------------------------------
# Copyright 2024 Kearn Chen, kearn.chen@aliyun.com
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -------------------------------------------------------------------------------------------------
# Description :
#             1. Run simulation
# -------------------------------------------------------------------------------------------------

TEST := hello_world_test

vcs:
	cp ../case/$(TEST).v testcase.v
	make -C ../test/$(TEST)
	vcs -full64 -sverilog +vcs+fsdbon -f ../list/filelist.vc
	./simv +ntb_random_seed_automatic -l simv.log

iverilog:
	cp ../case/$(TEST).v testcase.v
	make -C ../test/$(TEST)
	iverilog -o simv -f ../list/filelist.vc -g2012 -DDUMP_LXT2
	vvp simv -lxt2 -fst

verdi:
	verdi -sverilog -f ../list/filelist.vc &

gtkwave:
	gtkwave &

clean:
	rm -rf simv *.log csrc simv.daidir verdiLog ucli.key novas* *.v

7.总结

本文介绍了一个简单的验证环境,包括测试顶层及模型、脚本等代码,在后续的文章中会基于此验证环境给出具体的验证用例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

订单增长40%,磁性元件下半年还有哪些挑战?

导语 2024即将过半&#xff0c;哪些终端市场发展势头更好?海运价格上涨又会对磁性元件企业造成哪些影响? 2024年开春以来&#xff0c;比亚迪发起了新一轮价格战&#xff0c;让持续一年的新能源汽车价格战再度升级&#xff0c;也让2024年的市场走势更加扑朔迷离。 第二十二届(…

PMTiles介绍与MapboxGL中使用

概述 本文介绍PMTiles以及PMTiles在MapboxGL中的使用。 PMTiles简介 PMTiles 是一种对瓦片数据的单文件压缩格式。PMTiles 压缩包可以托管在如 S3 这样的商品级存储平台上&#xff0c;并允许创建低成本、零维护的“无服务器”地图应用程序——这些应用程序无需自定义瓦片后端…

手机误操作导致永久删除照片的恢复方法有哪些?

随着手机功能的不断增强和应用程序的不断丰富&#xff0c;人们越来越依赖手机&#xff0c;离不开手机。但有时因为我们自己的失误操作&#xff0c;导致我们手机上重要的照片素材被永久删除&#xff0c;这时我们需要怎么做&#xff0c;才能找回我们被永久删除的照片素材呢&#…

LeetCode.676.实现一个魔法字典

题目描述&#xff1a; 设计一个使用单词列表进行初始化的数据结构&#xff0c;单词列表中的单词 互不相同 。 如果给出一个单词&#xff0c;请判定能否只将这个单词中一个字母换成另一个字母&#xff0c;使得所形成的新单词存在于你构建的字典中。 实现 MagicDictionary 类&a…

前端工程化项目 用npm拉git项目的时候是在是太慢了怎么办

最近在家拉git项目发现npm i之后,开始下得挺快&#xff0c;过会就卡着不动了&#xff0c;大概几分钟后才下好。这对一个有强迫症的码农来说是不能容忍的。 只能退出去 重新下载 其实我们只要换一下国内的下载镜像源就好了 npm config set registry https://registry.npmmirror…

[C++][opencv]基于opencv实现photoshop算法灰度化图像

测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 BlackWhite.hpp #ifndef OPENCV2_PS_BLACKWHITE_HPP_ #define OPENCV2_PS_BLACKWHITE_HPP_#include "opencv2/core.hpp"namespace cv {class BlackWhite { public:float red; //红色的灰度系…

vs code编辑区域右键菜单突然变短

今天打开vs code发现鼠标在编辑区域按右键&#xff0c;出来的菜单只显示一小段 显示不全&#xff0c;而之前的样子是 显示很多项&#xff0c;怎么设置回到显示很多项呢&#xff1f;

自动驾驶TPM技术杂谈 ———— 可行驶区域

文章目录 介绍基于传统计算机视觉的方法基于直接特征的可行驶区域检测基于颜色的可行驶区域检测基于纹理的可行驶区域检测基于边缘的可行驶区域检测 基于间接特征的可行驶区域检测 基于深度学习的方法语义分割基于FCN的可行驶区域分割 介绍 可行驶区域检测主要是为了自动驾驶提…

数据科学的定义,如果做数据科学,非计算机的你,一般来说最好还是选择R语言,图像挖掘除外

一、数据科学&#xff08;Data Science&#xff09; 数据科学的起源可以追溯到1962年&#xff0c;当时统计学家John W. Tukey在他的文章《数据分析的未来》中首次提出了数据分析作为一门独立的科学方法。1974年&#xff0c;计算机学家Peter Naur在《计算机方法的简明调研》中明…

shell外壳与Linux权限

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…

大语言模型 LLM book 笔记(二)

第二部分 预训练 第四章 数据准备 4.1 数据来源 4.1.1 通用文本数据 网页 书籍 4.1.2 专用文本数据 多语文本 科学文本 代码 4.2 数据预处理 4.2.1 质量过滤 基于启发式规则的方法 基于语种的过滤&#xff1a;语言识别器筛选中英文&#xff0c;对于多语的维基百科由于…

高阶数据结构——LRU Cache

1.什么是LRU Cache LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c; 通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂贵但较快速…

制约AI发展的关键在于人机环境系统智能的失配

人工智能&#xff08;AI&#xff09;发展的关键挑战之一就是人机环境系统之间的智能失配。这种失配指的是人工智能系统、其操作人员和应用环境之间的协调和适配问题&#xff0c;通常会影响系统的有效性和安全性。以下是一些具体方面&#xff0c;这些方面展示了人机环境系统智能…

《企业微服务实战 · 接口鉴权思路分享》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

ES JavaApi

1.RestClient操作索引库 2.RestClient操作文档 2.1查询 2.2更新 2.3删除 2.4批量新增&#xff08;bulk&#xff09; 3.DSL查询 对应的api 3.0解析响应 3.1全文检索 3.2精确查询 3.3复合查询-boolQuery 构建boolQuery 3.4排序和分页 3.5高亮

浙大数据结构慕课课后题(06-图2 Saving James Bond - Easy Version)(拯救007)

题目要求&#xff1a; This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake fi…

C++打怪小游戏

这是一款用C代码写出来的打怪游戏。 上图片&#x1f447; ![](https://i-blog.csdnimg.cn/direct/6a4497c784ff4ba7a3332bc97d433789.png 一个11岁小朋友&#xff0c;爆肝532行&#xff0c;11小时完成代码&#xff0c;内部14个函数&#xff0c;5个结构体&#xff0c;三连…

ffmpeg使用x11录屏

version #define FFMPEG_VERSION "6.1.1" note x11视频采集结构:AVInputFormat ff_xcbgrab_demuxer code void CFfmpegOps::CaptureVideo(const char *outFileName) {const AVInputFormat *iFmt nullptr;size_t n 0;AVFormatContext *iFmtCtx nullptr;AVDict…

三十九、大数据技术之Kafka3.x(2)

&#x1f33b;&#x1f33b; 目录 一、Kafka 生产者1.1 生产者消息发送流程1.1.1 发送原理1.1.2 生产者重要参数列表 1.2 异步发送API1.2.1 普通异步发送1.2.2 带回调函数的异步发送 1.3 同步发送 API1.4 生产者分区1.4.1 分区好处1.4.2 生产者发送消息的分区策略1.4.3 自定义分…

使用Leaks定位iOS内存泄漏问题并解决

使用Leaks定位iOS内存泄漏问题并解决 前言 内存泄漏问题一直是程序开发中最令人头疼的问题&#xff0c;特别是C/C。虽然C/C在C11之后引入了许多新特性&#xff0c;包括智能指针&#xff0c;自动类型推导等&#xff0c;但C中动态内存的分配和释放仍然需要程序员来显式地进行。…