
skybox _core
文章平均质量分 91
skybox core 模块代码分析
CDerL
RISC-V、硬件建模、硬件验证、智能网卡、DPU、Android、NPU、AI、NIC(network_interconnect)软件架构
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
RISC_V GPU skybox 系列之rtlsim运行测试(4)
中,我们介绍了1-5部分内容,这里我们继续介绍。原创 2025-03-29 00:15:00 · 1356 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim运行测试(3)
中,我们介绍了1,2,3部分内容,这里我们继续介绍。原创 2025-03-29 00:30:00 · 741 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim运行测试(2)
此构造函数接收一个参数,用于配置 DRAM 内存系统的时钟比率。通过YAML::Node对象构建配置信息,然后使用创建前端和内存系统实例,并将它们相互连接。该构造函数的主要目的是初始化仿真环境,包括随机信号生成、断言控制、RTL 模块实例化、VCD 跟踪设置、设备配置信息输出和设备重置。通过这些步骤,确保仿真环境的正确性和可重复性。原创 2025-03-28 00:30:00 · 1764 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim运行测试(1)
定义了测试文件所在的目录,该目录依赖于环境变量。wildcard函数用于匹配指定目录下的所有符合模式的文件。filter-out函数用于从匹配的文件列表中排除指定的文件。这些变量分别定义了 32 位和 64 位不同 RISC-V 扩展的测试文件列表。all这段代码定义了一个名为的make目标,其主要功能是对 32 位的 RISC-V 指令集测试用例(涵盖IMF扩展)执行 RTL(寄存器传输级)仿真。这里定义了一个make目标。当在命令行中执行时,make工具会执行该目标下的命令。原创 2025-03-28 00:45:00 · 897 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim 主程序相关
rtlsim文件夹下的代码主要实现了一个仿真程序,该程序能够加载二进制或十六进制格式的程序文件,然后模拟处理器执行该程序,并最终从特定地址读取退出码。这段 C++ 代码是一个模拟处理器运行程序的主程序,主要功能是解析命令行参数,创建内存模块和处理器实例,将内存模块与处理器关联,设置处理器的一些基本控制寄存器(DCR),加载指定的程序文件(支持.bin和.hex格式),然后运行模拟并从特定内存地址读取程序的退出码。4096定义了内存页的大小为 4096 字节。原创 2025-03-27 00:15:00 · 794 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim编译(2)
在在 skybox 系列之rtlsim编译时–exe 和–cc $(TOP)包含了两个步骤,第一步 将rtl code 编译成C++代码,通过–cc Vortex --top-module Vortex来完成第二步 将src + 编译完成的rtl 对应的c++代码编译成可执行的exe程序,通过参数–exe来完成本文章我们来分别说明第一个部分的内容。原创 2025-03-24 00:30:00 · 569 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim编译(1)
目标,这里DESTDIR默认为当前目录(CURDIR),PROJECT被定义为rtlsim,所以最终目标是在指定目录下生成rtlsim可执行文件。依赖项$(SRCS):包含多个源文件,如等,这些源文件路径通过之前的变量定义确定。:主源文件,路径由SRC_DIR变量和文件名main.cpp组成,SRC_DIR被定义为。命令使用verilator工具进行构建。--build选项表示进行构建操作。:包含一系列 Verilator 的编译选项,如语言标准、警告选项、跟踪选项等。原创 2025-03-27 00:45:00 · 695 阅读 · 0 评论 -
RISC_V GPU skybox 系列之rtlsim: mem.h/cpp
文件里的类通过继承和调用关系构建了一个完整的内存管理系统。MemDevice作为抽象基类,定义了内存设备的基本接口;和RAM作为具体的内存设备实现了这些接口;MemoryUnit类负责内存的管理和映射,ADecoder类用于地址解码和内存设备查找;ACLManager类用于管理访问控制列表。各个类相互协作,共同完成内存的读写、映射和访问控制等功能。原创 2025-03-27 00:30:00 · 946 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lmem_unit.sv
() (`endif输入clk: 时钟信号。reset: 复位信号。: 输入负载存储单元接口数组,数量为负载存储单元块数(输出cache_perf: 缓存性能计数器(仅在定义时)。: 输出负载存储单元接口数组,数量为负载存储单元块数(静态断言检查本地内存大小是否是内存块大小的倍数。检查本地内存基地址是否对齐。局部参数REQ_DATAW: 请求数据宽度。RSP_DATAW: 响应数据宽度。: 本地内存地址宽度。这段代码实现了一个本地内存单元。原创 2025-03-19 00:45:00 · 521 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_issue_slice.sv
() (`endif输入clk: 时钟信号。reset: 复位信号。decode_if: 解码接口。: 写回接口。: 分发接口数组,数量为执行单元数(输出issue_perf: 性能计数器(仅在定义时)。这段代码实现了一个指令发射单元,负责处理指令发射过程中的多个阶段。它通过实例化指令缓冲、记分牌、操作数和指令分发模块,并在时钟周期内协调它们的工作,实现了指令的发射和执行。代码还包含了调试和跟踪功能,便于在开发和测试过程中进行调试和数据采集。原创 2025-03-18 00:45:00 · 547 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_fpu_unit.sv
() (// Inputs// Outputs输入clk: 时钟信号。reset: 复位信号。: 发射接口,数量为发射宽度(输出commit_if: 提交接口,数量为发射宽度(fpu_csr_if: FPU CSR接口,数量为FPU块(参数BLOCK_SIZE: 块大小,等于FPU块数量(NUM_LANES: 通道数,等于FPU通道数量(PID_BITS: 进程ID位数。PID_WIDTH: 进程ID宽度。TAG_WIDTH: 标签宽度,等于浮点队列大小(原创 2025-03-18 00:45:00 · 970 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_gather_unit.sv
() (// inputs// outputs参数BLOCK_SIZE: 块大小,表示每个块包含的通道数。NUM_LANES: 通道数。OUT_BUF: 输出缓冲区大小。输入clk: 时钟信号。reset: 复位信号。: 块大小数量的提交接口,作为从设备。输出: 提交接口数组,作为主设备,数量为发射宽度(静态断言: 检查发射宽度能被块大小整除,以及线程数量能被通道数整除。局部参数: 块大小的对数值。PID_BITS: 进程ID位数。PID_WIDTH: 进程ID宽度。原创 2025-03-17 00:30:00 · 1084 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_operands.sv
() (`endif输入clk: 时钟信号。reset: 复位信号。: 写回接口。: 记分牌接口。输出: 性能计数器(仅在定义时)。: 操作数接口。: 源寄存器数量。: 请求选择位数。: 请求选择宽度。: 银行选择位数。: 银行选择宽度。: 每个银行的寄存器数量。META_DATAW: 元数据宽度。REGS_DATAW: 寄存器数据宽度。DATAW: 数据宽度。RAM_ADDRW: RAM地址宽度。: 每个银行的地址宽度。原创 2025-03-17 00:30:00 · 995 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_scoreboard.sv
() (`endif输入clk: 时钟信号。reset: 复位信号。: 写回接口。ibuffer_if: 指令缓冲接口,数量为每个发射warp数(输出: 性能计数器(仅在定义时)。: 执行单元使用性能计数器(仅在定义时)。: 专用功能单元(SFU)使用性能计数器(仅在定义时)。: 记分牌接口。DATAW: 数据宽度参数,用于定义记分牌数据位宽。staging_if: 阶段接口,用于暂存指令缓冲数据。: 操作数准备信号数组。原创 2025-03-17 00:45:00 · 230 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_dcr_data.sv & VX_ibuffer.sv & VX_ipdom_stack.sv
/ Inputs// Outputs输入clk: 时钟信号。reset: 复位信号。dcr_bus_if: DCR总线接口,作为从设备。输出base_dcrs: 基础DCR信号。reset: 复位信号(未使用)。dcrs: 一个类型的寄存器,用于存储DCR数据。定义和初始化寄存器: 定义用于存储DCR数据的寄存器dcrs。时钟上升沿触发的写操作: 根据DCR总线接口的写地址和写数据更新dcrs寄存器的相应字段。输出信号: 将dcrs寄存器的值赋给输出信号base_dcrs。原创 2025-03-13 09:55:18 · 980 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_csr_data.sv(2)
///#() (endendendendendcaseendendendendendcaseendendmodule该模块实现了CSR的读写操作,通过读取和写入CSR数据,与其他模块进行交互,并确保操作的正确执行和结果的正确存储。mscratch: 一个宽度为XLEN位的寄存器,用于存储CSR写操作的数据。这段代码描述了在时钟上升沿触发的CSR写操作。复位条件: 当复位信号为高时,mscratch。原创 2025-03-13 09:54:55 · 614 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_csr_data.sv(1)
endif#() (`endif参数: 实例ID,用于标识不同实例。CORE_ID: 核心ID。输入clk: 时钟信号。reset: 复位信号。base_dcrs: 基础DCRS信号。: 提交CSR接口。fpu_csr_if: FPU CSR接口(可选)。cycles: 性能计数器周期。: 活跃的warp。: 线程掩码。: 读使能信号。read_uuid: 读UUID。read_wid: 读warp ID。read_addr: 读地址。: 写使能信号。原创 2025-03-13 09:54:42 · 295 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_csr_unit.sv(2)
该模块实现了CSR的读写操作,通过读取和写入CSR数据,与其他模块进行交互,并通过弹性缓冲区存储CSR请求和响应数据。++i) begin= 0) beginendendwtid: 线程ID,计算方式是当前进程ID乘以通道数量加上通道索引。如果PID_BITS不为0,使用上述方式计算;否则,直接使用通道索引。gtid: 全局ID,计算方式是当前核心ID左移(NW_BITS +NT_BITS)位,加上当前warp ID左移NT_BITS位,再加上线程ID。原创 2025-03-13 09:54:28 · 745 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_sfu_unit.sv
() (`endif// Inputs`endif`endif`endif`endif`endif`endif`endif// Outputs输入clk: 时钟信号。reset: 复位信号。base_dcrs: 基础DCRs信号。: 分派接口。条件编译输入信号(如fpu_csr_iftex_bus_ifom_bus_if等)。输出commit_if: 提交接口。: warp控制接口。原创 2025-03-13 09:53:54 · 852 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_split_join.sv & VX_trace_pkg.sv
() (输入clk: 时钟信号。reset: 复位信号。valid: 有效信号。split: 分裂信息结构。sjoin: 合并信息结构。stack_wid: 堆栈warp ID。输出join_valid: 合并有效信号。: 合并处于发散状态。: 合并处于else状态。join_wid: 合并warp ID。join_tmask: 合并线程掩码。join_pc: 合并程序计数器。stack_ptr: 堆栈指针。信号定义。原创 2025-03-19 04:30:00 · 748 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_csr_unit.sv(1)
() (`endif`endif`endif`endif`endif`endif`endif`endif参数: 实例ID,用于标识不同实例。CORE_ID: 核心ID。NUM_LANES: 并行处理的通道数量。输入clk: 时钟信号。reset: 复位信号。base_dcrs: 基础DCRS信号。: 性能接口(可选)。tex_csr_ifom_csr_if: 扩展CSR接口(可选)。fpu_csr_if: FPU CSR接口。execute_if。原创 2025-03-12 14:28:20 · 924 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_alu_unit.sv
(// Inputs// Outputs参数: 实例ID,用于标识不同实例。输入clk: 时钟信号。reset: 复位信号。: 分发接口输入,宽度由定义。输出commit_if: 提交接口输出,宽度由定义。: 分支控制接口输出,宽度由定义。模块负责处理ALU操作,支持多个计算块和通道。模块包括整数ALU单元和乘法/除法ALU单元(如果启用了扩展M)。代码通过多输入流仲裁器和结果收集单元处理多个输入和输出,确保操作的正确执行和结果的正确存储。原创 2025-03-12 14:27:55 · 727 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_alu_muldiv.sv(2)
PID_BITSPID_BITS是一个局部参数,用于计算进程ID所需的位数。它使用了CLOG2宏,以计算除以NUM_LANES的对数值。: 表示线程的总数。NUM_LANES: 表示处理通道的数量。PID_WIDTHPID_WIDTH是一个局部参数,用于表示进程ID的宽度。它使用了UP宏,以确保PID_BITS的值向上取整。TAG_WIDTHTAG_WIDTH是一个局部参数,用于计算标签的总宽度。它包括了多个参数的宽度总和,如UUID_WIDTHNW_WIDTHNUM_LANES。原创 2025-03-12 12:52:17 · 898 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_alu_muldiv.sv(1)
(// Inputs// Outputs参数: 实例ID,用于标识不同实例。NUM_LANES: 并行处理的通道数量,默认为1。输入clk: 时钟信号。reset: 复位信号。execute_if: 执行接口输入。输出commit_if: 提交接口输出。模块负责在Vortex GPU架构中执行乘法和除法操作。它支持多个并行处理通道,处理有符号和无符号操作,并包括条件编译以支持不同的实现配置。模块与执行和提交接口交互,确保数据正确处理和提交。原创 2025-03-12 12:51:55 · 1220 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_alu_int.sv(2)
该宏通常用于标记未使用的参数,以避免编译器警告。是一个字符串参数,表示模块的实例ID。localparam: 局部参数,类似于常量,用于定义模块内部的固定值。LANE_BITS使用CLOG2宏计算NUM_LANES的对数值,以确定需要多少位来表示NUM_LANES。例如,如果NUM_LANES是 4,则LANE_BITS为 2(因为 2 位可以表示 4 个值)。LANE_WIDTH使用UP宏将LANE_BITS向上取整,以确保足够的位宽。例如,如果LANE_BITS。原创 2025-03-18 05:00:00 · 824 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之 VX_alu_int.sv(1)
(// Inputs// OutputsBLOCK_IDXNUM_LANES参数。clk和reset输入信号。execute_if输入接口。commit_if和输出接口。定义了一些局部参数。和被标记为未使用。定义了各种运算结果的信号。文件定义了一个整数 ALU 模块VX_alu_int,该模块处理各种 ALU 操作,包括加法、减法、逻辑移位和其他逻辑操作。它还处理分支操作,并通过和模块将结果传递给提交和分支控制接口。原创 2025-03-18 05:00:00 · 248 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lsu_adapter.sv
() (NUM_LANES: 通道数量。DATA_SIZE: 数据大小。TAG_WIDTH: 标签宽度。: 标签选择位数。ARBITER: 仲裁器类型。REQ_OUT_BUF 和 RSP_OUT_BUF: 输出缓冲区大小。clk: 时钟信号。reset: 复位信号。lsu_mem_if: LSU 内存接口,作为从属接口。mem_bus_if: 内存总线接口,作为主接口。: 请求地址宽度。: 请求数据宽度,包括读写标志、字节使能、地址、地址类型和数据。: 响应数据宽度。原创 2025-03-17 05:00:00 · 972 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lsu_unit.sv & VX_lsu_slice.sv(4)
这段代码实现了内存响应的解包和加载数据的格式化。通过解包内存响应标签,将内存响应的各个字段分离出来,并根据操作类型,对加载的数据进行格式化处理,确保数据在不同位宽和格式下能够正确处理和使用。这段代码实现了内存响应数据的提交逻辑,包括响应数据和无响应数据的处理。使用弹性缓冲区()存储和传输数据,并通过流仲裁器()仲裁多个输入的数据流,最终输出到commit_if接口。这确保了内存响应数据的有效传输和处理。这段代码实现了内存请求和响应的调试跟踪和范围探针功能。原创 2025-03-17 05:00:00 · 864 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lsu_unit.sv & VX_lsu_slice.sv(3)
pkt_waddr 和 pkt_raddr:这些信号用于指示内存请求和响应的队列地址。原创 2025-03-16 05:00:00 · 673 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lsu_unit.sv & VX_lsu_slice.sv(2)
req_skip:当请求是栅栏操作且当前指令不是结束指令时,该信号为高,表示跳过当前请求。:当请求是写操作且不需要写回,或请求是栅栏操作且需要跳过时,该信号为高,表示不需要响应缓冲。原创 2025-03-16 05:00:00 · 1534 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_lsu_unit.sv & VX_lsu_slice.sv(1)
这段代码实现了一个名为的模块,用于加载/存储单元(Load/Store Unit, LSU)。该模块从调度单元接收指令,并将它们分发到多个 LSU 切片(slice),然后收集结果并提交。原创 2025-03-15 05:00:00 · 621 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_fetch.sv
这段代码实现了一个名为VX_fetch的模块,用于指令获取(Fetch)阶段。它从指令缓存(Icache)中获取指令,并将其传递给解码阶段。原创 2025-03-15 05:00:00 · 1468 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_decode.sv(2)
这段代码实现了对各种操作码(opcode)的解析和处理,包括整数立即数指令、整数寄存器指令、加载高位立即数指令、带地址更新的立即数指令、跳转并链接指令、跳转并链接寄存器指令、分支指令、内存屏障指令、系统指令、加载指令、存储指令以及一些自定义扩展指令。代码通过设置执行类型、操作类型和操作参数来实现指令解码,并根据需要使用目的寄存器和源寄存器。禁用了对整数寄存器 r0 的写入,以确保其值保持为零。原创 2025-03-14 05:00:00 · 429 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_decode.sv(1)
这段代码实现了一个名为VX_decode的模块,用于指令解码。它从获取阶段(fetch phase)接收指令并解析其操作码、功能码等,然后生成相应的操作类型和操作数,并将这些信息传递给解码阶段的其他模块。原创 2025-03-14 05:00:00 · 467 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_commit.sv
DATAW计算了各种数据宽度的总和。计算了表示提交大小所需的位数。计算了表示所有提交大小总和所需的总位数。这些参数在硬件设计中用于定义信号和寄存器的宽度,以确保正确的数据传输和存储。这段代码通过从多个执行单元中收集数据,并通过仲裁器进行选择和输出,来处理提交阶段的仲裁。它定义了输入和输出接口,并通过仲裁器模块来管理数据流动和信号传递。这段代码在宏定义有效时,通过TRACE宏和宏输出详细的调试信息。它在每个时钟周期内检查提交接口的有效和准备信号,并在条件满足时输出相关的追踪信息,用于调试和验证提交操作。原创 2025-03-13 06:00:00 · 662 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_issue.sv
模块的主要功能是处理指令的解码、写回和分派。它通过实例化和配置各种接口模块,管理指令在不同阶段的流动。从解码器接收指令并准备好发送到执行单元。管理指令的写回操作。将指令分派到适当的执行单元。(可选)记录性能数据。该模块可以作为VX_issue模块测试的top module。VX_issueVX_issue模块的主要功能是处理指令的解码、写回和分派。定义信号decode_isw和decode_wisdecode_isw和decode_wis是两个信号,分别通过函数wid_to_isw和。原创 2025-03-12 06:30:00 · 1101 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_schedule.sv(二)
这行代码表明base_dcrs参数未被使用,避免编译器警告。这段代码主要负责在时钟上升沿更新各种状态寄存器,确保Warp的正确调度和执行。通过处理复位信号、Warp生成、全局屏障调度和指令计数等操作,调度器能够有效地管理和调度Warp,确保多线程计算任务的正确执行。这行代码使用宏定义,将信号与reset信号关联,用于在复位时重置信号。这段代码通过实例化模块,处理 GPU 中 Warp 的分裂和合并操作。定义并重置信号。实例化模块,传递必要的参数和信号。原创 2025-03-12 06:30:00 · 780 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_schedule.sv(一)
模块主要负责 warp 的调度和状态管理。它处理 warp 的激活、分支指令、屏障指令等操作,并根据调度算法选择下一个准备好的 warp 进行调度。模块中还包括性能计数器,用于记录调度的空闲和停顿情况。总体而言,该模块是 Vortex GPU 项目中调度和控制的重要组成部分。在文件中,宏定义和用于启用性能计数器和全局屏障相关的功能。当宏定义被启用时,调度模块会记录调度器的空闲和停顿状态,并将这些信息存储在性能寄存器中。定义性能计数器输出接口`endif性能计数器寄存器性能计数器信号性能计数器逻辑。原创 2025-03-11 06:30:00 · 1682 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_dispatch_unit.sv
主要内容 模块是一个用于调度和分发操作数到执行单元的调度单元。它根据输入的调度接口,将操作数按块进行分发,并生成相应的控制信号传递给执行单元。输入接口:输出接口: 模块的主要作用是:参数计算:调度接口信号分配:块分发逻辑:批处理逻辑:准备信号生成:功能关系:接口关系:数据关系: 模块是调度单元的核心逻辑实现,负责将操作数和控制信号按块分发到执行单元。它与 模块紧密相关,共同完成操作数从接收到分发的全过程。这两行代码使用静态断言来确保 可以被 整除,以及 可以被 整除。如果这些条件不满足,将会原创 2025-03-11 06:30:00 · 1753 阅读 · 0 评论 -
RISC_V GPU skybox 系列 core 模块之VX_dispatch.sv
模块根据不同的参数条件,动态选择不同的缓冲实现方式,以优化数据流的调度和传输。它能够处理不同数据宽度和缓冲大小的需求,并提供多种缓冲机制(如直接传输、分片处理、管道缓冲、滑动缓冲和 FIFO 缓冲)以适应不同的应用场景。直接传输适合对延迟要求极高且输入输出速率匹配的场景。分片处理适合处理大数据宽度且需要并行处理的场景,但实现复杂。管道缓冲适合需要高吞吐量的场景,但会增加延迟和资源占用。滑动缓冲适合临时缓冲需求且实现简单的场景,但缓冲能力有限。FIFO 缓冲。原创 2025-03-10 10:17:07 · 1066 阅读 · 0 评论