RISC_V GPU skybox 系列 core 模块之VX_lsu_unit.sv & VX_lsu_slice.sv(4)

VX_lsu_slice.sv

内存调度器

  wire                                    lsu_mem_req_valid;
    wire                                    lsu_mem_req_rw;
    wire [NUM_LANES-1:0]                    lsu_mem_req_mask;
    wire [NUM_LANES-1:0][LSU_WORD_SIZE-1:0] lsu_mem_req_byteen;
    wire [NUM_LANES-1:0][LSU_ADDR_WIDTH-1:0] lsu_mem_req_addr;
    wire [NUM_LANES-1:0][`ADDR_TYPE_WIDTH-1:0] lsu_mem_req_atype;
    wire [NUM_LANES-1:0][(LSU_WORD_SIZE*8)-1:0] lsu_mem_req_data;
    wire [LSU_TAG_WIDTH-1:0]                lsu_mem_req_tag;
    wire                                    lsu_mem_req_ready;

    wire                                    lsu_mem_rsp_valid;
    wire [NUM_LANES-1:0]                    lsu_mem_rsp_mask;
    wire [NUM_LANES-1:0][(LSU_WORD_SIZE*8)-1:0] lsu_mem_rsp_data;
    wire [LSU_TAG_WIDTH-1:0]                lsu_mem_rsp_tag;
    wire                                    lsu_mem_rsp_ready;

    `RESET_RELAY (mem_scheduler_reset, reset);

    VX_mem_scheduler #(
        .INSTANCE_ID ($sformatf("%s-scheduler", INSTANCE_ID)),
        .CORE_REQS   (NUM_LANES),
        .MEM_CHANNELS(NUM_LANES),
        .WORD_SIZE   (LSU_WORD_SIZE),
        .LINE_SIZE   (LSU_WORD_SIZE),
        .ADDR_WIDTH  (LSU_ADDR_WIDTH),
        .ATYPE_WIDTH (`ADDR_TYPE_WIDTH),
        .TAG_WIDTH   (TAG_WIDTH),
        .CORE_QUEUE_SIZE (`LSUQ_IN_SIZE),
        .MEM_QUEUE_SIZE (`LSUQ_OUT_SIZE),
        .UUID_WIDTH  (`UUID_WIDTH),
        .RSP_PARTIAL (1),
        .MEM_OUT_BUF (0),
        .CORE_OUT_BUF(0)
    ) mem_scheduler (
        .clk            (clk),
        .reset          (mem_scheduler_reset),

        // Input request
        .core_req_valid (mem_req_valid),
        .core_req_rw    (mem_req_rw),
        .core_req_mask  (mem_req_mask),
        .core_req_byteen(mem_req_byteen),
        .core_req_addr  (mem_req_addr),
        .core_req_atype (mem_req_atype),
        .core_req_data  (mem_req_data),
        .core_req_tag   (mem_req_tag),
        .core_req_ready (mem_req_ready),
        `UNUSED_PIN (core_req_empty),
        `UNUSED_PIN (core_write_notify),

        // Output response
        .core_rsp_valid (mem_rsp_valid),
        .core_rsp_mask  (mem_rsp_mask),
        .core_rsp_data  (mem_rsp_data),
        .core_rsp_tag   (mem_rsp_tag),
        .core_rsp_sop   (mem_rsp_sop),
        .core_rsp_eop   (mem_rsp_eop),
        .core_rsp_ready (mem_rsp_ready),

        // Memory request
        .mem_req_valid  (lsu_mem_req_valid),
        .mem_req_rw     (lsu_mem_req_rw),
        .mem_req_mask   (lsu_mem_req_mask),
        .mem_req_byteen (lsu_mem_req_byteen),
        .mem_req_addr   (lsu_mem_req_addr),
        .mem_req_atype  (lsu_mem_req_atype),
        .mem_req_data   (lsu_mem_req_data),
        .mem_req_tag    (lsu_mem_req_tag),
        .mem_req_ready  (lsu_mem_req_ready),

        // Memory response
        .mem_rsp_valid  (lsu_mem_rsp_valid),
        .mem_rsp_mask   (lsu_mem_rsp_mask),
        .mem_rsp_data   (lsu_mem_rsp_data),
        .mem_rsp_tag    (lsu_mem_rsp_tag),
        .mem_rsp_ready  (lsu_mem_rsp_ready)
    );

    assign lsu_mem_if.req_valid = lsu_mem_req_valid;
    assign lsu_mem_if.req_data.mask = lsu_mem_req_mask;
    assign lsu_mem_if.req_data.rw = lsu_mem_req_rw;
    assign lsu_mem_if.req_data.byteen = lsu_mem_req_byteen;
    assign lsu_mem_if.req_data.addr = lsu_mem_req_addr;
    assign lsu_mem_if.req_data.atype = lsu_mem_req_atype;
    assign lsu_mem_if.req_data.data = lsu_mem_req_data;
    assign lsu_mem_if.req_data.tag = lsu_mem_req_tag;
    assign lsu_mem_req_ready = lsu_mem_if.req_ready;

    assign lsu_mem_rsp_valid = lsu_mem_if.rsp_valid;
    assign lsu_mem_rsp_mask = lsu_mem_if.rsp_data.mask;
    assign lsu_mem_rsp_data = lsu_mem_if.rsp_data.data;
    assign lsu_mem_rsp_tag = lsu_mem_if.rsp_data.tag;
    assign lsu_mem_if.rsp_ready = lsu_mem_rsp_ready;

    wire [`UUID_WIDTH-1:0] rsp_uuid;
    wire [`NW_WIDTH-1:0] rsp_wid;
    wire [`PC_BITS-1:0] rsp_pc;
    wire rsp_wb;
    wire [`NR_BITS-1:0] rsp_rd;
    wire [`INST_LSU_BITS-1:0] rsp_op_type;
    wire [NUM_LANES-1:0][REQ_ASHIFT-1:0] rsp_align;
    wire [PID_WIDTH-1:0] rsp_pid;
    `UNUSED_VAR (rsp_op_type)

这段代码实现了一个LSU(Load/Store Unit)模块的内存请求和响应处理逻辑。它包括信号定义、内存调度器实例化、信号赋值以及内存响应标签的解包。

主要功能

  1. 信号定义:定义了与内存请求和响应相关的信号,包括请求有效性、读写标志、掩码、字节使能、地址、数据和标签等。
  2. 内存调度器实例化:实例化了VX_mem_scheduler模块,用于协调内存请求和响应的调度。
  3. 信号赋值:将内部信号赋值给接口信号,以便与外部模块进行通信。
  4. 内存响应标签解包:将内存响应标签解包为各个字段,以便进一步处理。

接口描述

  • 输入接口

    • core_req_valid:内存请求有效信号。
    • core_req_rw:读写标志。
    • core_req_mask:请求掩码。
    • core_req_byteen:字节使能信号。
    • core_req_addr:请求地址。
    • core_req_atype:地址类型。
    • core_req_data:请求数据。
    • core_req_tag:请求标签。
    • core_req_ready:内存调度器是否准备好接收请求。
  • 输出接口

    • core_rsp_valid:内存响应有效信号。
    • core_rsp_mask:响应掩码。
    • core_rsp_data:响应数据。
    • core_rsp_tag:响应标签。
    • core_rsp_sop:响应开始信号。
    • core_rsp_eop:响应结束信号。
    • core_rsp_ready:内存调度器是否准备好发送响应。
输入数据流
  • 内存请求信号
    • mem_req_valid:指示内存请求是否有效。
    • mem_req_rw:内存请求的读/写标志。
    • mem_req_mask:内存请求的掩码。
    • mem_req_byteen:内存请求的字节使能信号。
    • mem_req_addr:内存请求的地址。
    • mem_req_atype:内存请求的地址类型。
    • mem_req_data:内存请求的数据。
    • mem_req_tag:内存请求的标签。
    • mem_req_ready:指示内存系统是否准备好接收请求。
输出数据流
  • 内存响应信号
    • mem_rsp_valid:指示内存响应是否有效。
    • mem_rsp_mask:内存响应的掩码。
    • mem_rsp_data:内存响应的数据。
    • mem_rsp_tag:内存响应的标签。
    • mem_rsp_ready:指示核心是否准备好接收响应。

解包内存响应标签

    // unpack memory response tag
    assign {
   
        rsp_uuid,
        rsp_wid,
        rsp_pc,
        rsp_wb,
        rsp_rd,
        rsp_op_type,
        rsp_align,
        rsp_pid,
        pkt_raddr,
        rsp_is_fence
    } = mem_rsp_tag;

 
  • 解包(unpack):将 mem_rsp_tag 信号解包成多个单独的信号。这些信号包含了内存响应的各种信息,例如唯一标识符(UUID)、工作线程ID(wid)、程序计数器(PC)、写回标志(wb)、目的寄存器(rd)、操作类型(op_type)、对齐信息(align)、进程ID(pid)、包读地址(pkt_raddr)和栅栏标志(fence)。

加载响应数据的格式化

// load response formatting
reg [NUM_LANES-1:0][`XLEN-1:0] rsp_data;

`ifdef XLEN_64
`ifdef EXT_F_ENABLE
// apply nan-boxing to flw outputs
wire rsp_is_float = rsp_rd[5];
`else
wire rsp_is_float = 0;
`endif
`endif
  • rsp_data:用于存储每个通道的加载响应数据。
  • rsp_is_float:在64位架构且启用浮点扩展(EXT_F_ENABLE)的情况下,判断目标寄存器是否为浮点寄存器。

数据位宽处理

根据架构位宽(32位或64位),对数据进行处理和格式化。

for (genvar i = 0; i < NUM_LANES; i++) begin
`ifdef XLEN_64
    wire [63:0] rsp_data64 = mem_rsp_data[i];
    wire [31:0] rsp_data32 = (rsp_align[i][2] ? mem_rsp_data[i][63:32] : mem_rsp_data[i][31:0]);
`else
    wire [31:0] rsp_data32 = mem_rsp_data[i];
`endif
    wire [15:0] rsp_data16 = rsp_align[i][1] ? rsp_data32[31:16] : rsp_data32[15:0];
    wire [7:0]  rsp_data8  = rsp_align[i][0] ? rsp_data16[15:8] : rsp_data16[7:0];
  • rsp_data64:在64位架构下,从 mem_rsp_data 中提取64位数据。
  • rsp_data32:从 mem_rsp_data 中提取32位数据,根据 rsp_align 决定高位或低位。
  • rsp_data16:从 rsp_data32 中提取16位数据,根据 rsp_align 决定高位或低位。
  • rsp_data8:从 rsp_data16 中提取8位数据,根据 rsp_align 决定高位或低位。
根据操作类型格式化数据
    always @(*) begin
        case (`INST_LSU_FMT(rsp_op_type))
        `INST_FMT_B:  rsp_data[i] = `XLEN'(signed'(rsp_data8));
        `INST_FMT_H:  rsp_data[i] = `XLEN'(signed'(rsp_data16));
        `INST_FMT_BU: rsp_data[i] = `XLEN'(unsigned'(rsp_data8));
        `INST_FMT_HU: rsp_data[i] = `XLEN'(unsigned'(rsp_data16));
    `ifdef XLEN_64
        `INST_FMT_W:  rsp_data[i] = rsp_is_float ? (`XLEN'(rsp_data32) | 64'hffffffff00000000) : `XLEN'(signed'(rsp_data32));
        `INST_FMT_WU: rsp_data[i] = `XLEN'(uns
# 【tokenizers-***.jar***文档.zip】 中包含: ***文档:【tokenizers-***-javadoc-API文档-中文(简体).zip】 jar包下载地址:【tokenizers-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【tokenizers-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【tokenizers-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【tokenizers-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: tokenizers-***.jar***文档.zip,java,tokenizers-***.jar,ai.djl.huggingface,tokenizers,***,ai.djl.engine.rust,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,djl,huggingface,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【tokenizers-***.jar***文档.zip】,再解压其中的 【tokenizers-***-javadoc-API文档-中文(简体).zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: &middot;本文档为人性化翻译,精心制作,请放心使用。 &middot;只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; &middot;不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择&ldquo;解压到当前文件夹&rdquo;(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` &lt;dependency&gt; &lt;groupId&gt;ai.djl.huggingface&lt;/groupId&gt; &lt;artifactId&gt;tokenizers&lt;/artifactId&gt; &lt;version&gt;***&lt;/version&gt; &lt;/dependency&gt; ``` # Gradle依赖: ``` Gradle: implementation group: &#39;ai.djl.huggingface&#39;, name: &#39;tokenizers&#39;, version: &#39;***&#39; Gradle (Short): implementation &#39;ai.djl.huggingface:tokenizers:***&#39; Gradle (Kotlin): implementation(&quot;ai.djl.huggingface:tokenizers:***&quot;) ``` # 含有的 Java package(包): ``` ai.djl.engine.rust ai.djl.engine.rust.zoo ai.djl.huggingface.tokenizers ai.djl.huggingface.tokenizers.jni ai.djl.huggingface.translator ai.djl.huggingface.zoo ``` # 含有的 Java class(类): ``` ai.djl.engine.rust.RsEngine ai.djl.engine.rust.RsEngineProvider ai.djl.engine.rust.RsModel ai.djl.engine.rust.RsNDArray ai.djl.engine.rust.RsNDArrayEx ai.djl.engine.rust.RsNDArrayIndexer ai.djl.engine.rust.RsNDManager ai.djl.engine.rust.RsSymbolBlock ai.djl.engine.rust.RustLibrary ai.djl.engine.rust.zoo.RsModelZoo ai.djl.engine.rust.zoo.RsZooProvider ai.djl.huggingface.tokenizers.Encoding ai.djl.huggingface.tokenizers.HuggingFaceTokenizer ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.Builder ai.djl.hu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值