Verilog实现两路组相联cache

2023-11-19

cache代码

`timescale 1ns / 1ps

//cache共32块,分为16组,每组2块,即两路组相联,1块=4字,1字=4字节
//主存共1024块,4096个字
//主存地址共12位,[1:0]为块内偏移,[5:2]为组地址,[11:6]为Tag
//V、D、Tag、Data=1+1+6+128=136

module cache(
input clk,
input rst,
//cpu<->cache
input [11:0]cpu_req_addr,
input cpu_req_valid,
input cpu_req_rw,
input [31:0]cpu_data_write,
output reg [31:0]cpu_data_read,
output reg cpu_ready,
//cache<->main memory
output reg [11:0]mem_req_addr,
output reg mem_req_rw,
output reg mem_req_valid,
output reg [127:0]mem_data_write,
input [127:0]mem_data_read,
input mem_ready
    );

parameter IDLE=0;
parameter CompareTag=1;
parameter Allocate=2;
parameter WriteBack=3;

parameter V=135;
parameter D=134;
parameter TagMSB=133;
parameter TagLSB=128;
parameter BlockMSB=127;
parameter BlockLSB=0;

reg [135:0] cache_data [0:31];
reg [1:0]state,next_state;
reg hit;
reg hit1,hit2;
reg way;                               //若hit,则way无意义,若miss,则way表示分配的那一路

wire [3:0]cpu_req_index;
wire [5:0]cpu_req_tag;
wire [1:0]cpu_req_offset;

assign cpu_req_offset=cpu_req_addr[1:0];
assign cpu_req_index=cpu_req_addr[5:2];
assign cpu_req_tag=cpu_req_addr[11:6];

integer i;
//初始化cache
initial
begin
    for(i=0;i<32;i=i+1)
        cache_data[i]=136'd0;
end
//
always@(posedge clk,posedge rst)
if(rst)
    state<=IDLE;
else
    state<=next_state;
//state change
always@(*)
case(state)
    IDLE:if(cpu_req_valid)
            next_state=CompareTag;
         else
            next_state=IDLE;
    CompareTag:if(hit)                     //若hit
                  next_state=IDLE;
               else if(cache_data[2*cpu_req_index+way][V:D]==2'b11) //被分配的块有效且脏,则先写回主存
                  next_state=WriteBack;
               else
                  next_state=Allocate;
    Allocate:if(mem_ready)
                  next_state=CompareTag;
             else
                  next_state=Allocate;
    WriteBack:if(mem_ready)
                  next_state=Allocate;
              else
                  next_state=WriteBack;
    default:next_state=IDLE;
endcase
//hit1
always@(*)
if(state==CompareTag)
    if(cache_data[2*cpu_req_index][V]==1'b1&&cache_data[2*cpu_req_index][TagMSB:TagLSB]==cpu_req_tag)
        hit1=1'b1;
    else
        hit1=1'b0;
else
    hit1=1'b0;
//hit2
always@(*)
if(state==CompareTag)
    if(cache_data[2*cpu_req_index+1][V]==1'b1&&cache_data[2*cpu_req_index+1][TagMSB:TagLSB]==cpu_req_tag)
        hit2=1'b1;
    else
        hit2=1'b0;
else
    hit2=1'b0;
//hit
always@(*)
if(state==CompareTag)
    hit=hit1||hit2;
else
    hit=1'b0;
//way       cache miss 时分配的块在组内的位置
always@(*)
if((state==CompareTag)&&(hit==1'b0))   //未命中
    case({cache_data[2*cpu_req_index][V],cache_data[2*cpu_req_index+1][V]})
        2'b01:way=1'b0;                    //第0路可用
        2'b10:way=1'b1;                    //第1路可用
        2'b00:way=1'b0;                    //第0、1路均可用
        2'b11:way=1'b0;                    //第0、1路均不可用,默认替换第0路
        default:way=1'b0;
    endcase

//CompareTag
always@(posedge clk)
if(state==CompareTag&&hit)
    if(cpu_req_rw==1'b0)                        //read hit
    begin
        cpu_ready<=1'b1;
        if(hit1)
            cpu_data_read<=cache_data[2*cpu_req_index][32*cpu_req_offset +:32];
        else
            cpu_data_read<=cache_data[2*cpu_req_index+1][32*cpu_req_offset +:32];
    end
    else                                       //write hit
    begin
        cpu_ready<=1'b1;
        if(hit1) 
        begin                                
            cache_data[2*cpu_req_index][32*cpu_req_offset +:32]<=cpu_data_write;
            cache_data[2*cpu_req_index][D]<=1'b1;
        end
        else
        begin
            cache_data[2*cpu_req_index+1][32*cpu_req_offset +:32]<=cpu_data_write;
            cache_data[2*cpu_req_index+1][D]<=1'b1;
        end
    end
else
    cpu_ready<=1'b0;
//Allocate and WriteBack
always@(posedge clk)
if(state==Allocate)                            //load new block from memory to cache
    if(!mem_ready)
    begin
        mem_req_valid<=1'b1;
        mem_req_addr<={cpu_req_addr[11:2],2'b00};
        mem_req_rw<=1'b0;
    end
    else
    begin
        mem_req_valid<=1'b0;
        cache_data[2*cpu_req_index+way]<={2'b10,cpu_req_tag,mem_data_read};
    end
else if(state==WriteBack)                    //write dirty old block to memory
    if(!mem_ready)
    begin
        mem_req_valid<=1'b1;
        mem_req_addr<={cache_data[2*cpu_req_index+way][TagMSB:TagLSB],cpu_req_index,2'b00};
        mem_data_write<=cache_data[2*cpu_req_index+way][BlockMSB:BlockLSB];
        mem_req_rw<=1'b1;                 
    end
    else
    begin
        mem_req_valid<=1'b0;
    end
else
   mem_req_valid<=1'b0;

endmodule

mem代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/08/20 14:24:27
// Design Name: 
// Module Name: mem
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module mem(
input clk,
input rst,
input [11:0]mem_req_addr,                        //[1:0]块内地址
input mem_req_rw,
input mem_req_valid,
input [127:0]mem_data_write,
output reg [127:0]mem_data_read,
output reg mem_ready
    );

reg [31:0] mem [0:4095];                 //4096个字,1024个块

integer i;
initial
begin
    for(i=0;i<4096;i=i+1)
        mem[i]=32'd0;
end

always@(posedge clk,posedge rst)
if(rst)
    mem_ready<=1'b0;
else if(mem_req_valid&&mem_req_rw==1'b1&&!mem_ready)                      //write
begin
    mem[mem_req_addr+3]=mem_data_write[127:96];
    mem[mem_req_addr+2]=mem_data_write[95:64];
    mem[mem_req_addr+1]=mem_data_write[63:32];
    mem[mem_req_addr]=mem_data_write[31:0];
    mem_ready<=1'b1;
end
else if(mem_req_valid&&mem_req_rw==1'b0&&!mem_ready)                      //read
begin
    mem_data_read={mem[mem_req_addr+3],mem[mem_req_addr+2],mem[mem_req_addr+1],mem[mem_req_addr]};
    mem_ready<=1'b1;
end
else if(mem_req_valid&&mem_ready)
    mem_ready<=1'b0;

endmodule


仿真文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/08/20 15:25:17
// Design Name: 
// Module Name: test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test(

    );

parameter Write1=0;
parameter Write2=1;
parameter Write3=2;
parameter Write4=3;
parameter Read1=4;
parameter Read2=5;
parameter Read3=6;
parameter Read4=7;

reg clk;
reg rst;

reg [3:0]state,next_state;

reg [11:0]cpu_req_addr;
reg cpu_req_rw;
reg cpu_req_valid;
reg [31:0]cpu_data_write;
wire [31:0]cpu_data_read;
wire cpu_ready;

wire [11:0]mem_req_addr;
wire mem_req_rw;
wire mem_req_valid;
wire [127:0]mem_data_write;
wire [127:0]mem_data_read;
wire mem_ready;

initial
begin
    clk=0;
    forever
    #5 clk=~clk;
end
initial
begin
    rst=1;
    #10
    rst=0;
end

always@(posedge clk,posedge rst)
if(rst)
   state<=Write1;
else
   state<=next_state;

always@(*)
case(state)
    Write1:if(cpu_ready)
           begin
               next_state=Write2;
               cpu_req_valid=1'b0;
           end
           else
               next_state=Write1;
    Write2:if(cpu_ready)
           begin
                next_state=Write3;
                cpu_req_valid=1'b0;
           end
           else
                next_state=Write2;
    Write3:if(cpu_ready)
           begin
                next_state=Write4;
                cpu_req_valid=1'b0;
           end
           else
                next_state=Write3;
    Write4:if(cpu_ready)
           begin
                next_state=Read1;
                cpu_req_valid=1'b0;
           end
            else
                next_state=Write4;
    Read1:if(cpu_ready)
          begin
              next_state=Read2;
              cpu_req_valid=1'b0;
          end
          else
              next_state=Read1;
    Read2:if(cpu_ready)
          begin
              next_state=Read3;
              cpu_req_valid=1'b0;
          end
          else
              next_state=Read2;
    Read3:if(cpu_ready)
          begin
              next_state=Read4;
              cpu_req_valid=1'b0;
          end
          else
              next_state=Read3;
    Read4:next_state=Read4;
    default:next_state=Write1;
endcase

always@(posedge clk,posedge rst)
if(rst)
begin
    cpu_req_valid<=1'b0;
    cpu_req_rw<=1'b0;
    cpu_req_addr<=12'd0;
    cpu_data_write<=32'd0;
end
else 
case(state)
    Write1:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b1;
        cpu_req_addr<=12'd0;
        cpu_data_write<=32'd8;
    end
    Write2:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b1;
        cpu_req_addr<=12'd64;
        cpu_data_write<=32'd9;
    end
    Write3:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b1;
        cpu_req_addr<=12'd128;
        cpu_data_write<=32'd6;
    end
    Write4:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b1;
        cpu_req_addr<=12'd65;
        cpu_data_write<=32'd7;
    end
    Read1:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b0;
        cpu_req_addr<=12'd0;
    end
    Read2:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b0;
        cpu_req_addr<=12'd4;
    end
    Read3:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b0;
        cpu_req_addr<=12'd68;
    end
    Read4:begin
        cpu_req_valid<=1'b1;
        cpu_req_rw<=1'b0;
        cpu_req_addr<=12'd65;
    end
    default:begin
        cpu_req_valid<=1'b0;
    end
endcase



cache U1(.clk(clk),
.rst(rst),
.cpu_req_addr(cpu_req_addr),
.cpu_req_rw(cpu_req_rw),
.cpu_req_valid(cpu_req_valid),
.cpu_data_write(cpu_data_write),
.cpu_data_read(cpu_data_read),
.cpu_ready(cpu_ready),
//***********************//
.mem_req_addr(mem_req_addr),
.mem_req_rw(mem_req_rw),
.mem_req_valid(mem_req_valid),
.mem_data_write(mem_data_write),
.mem_data_read(mem_data_read),
.mem_ready(mem_ready));

mem U2(.clk(clk),
.rst(rst),
.mem_req_addr(mem_req_addr),
.mem_req_rw(mem_req_rw),
.mem_req_valid(mem_req_valid),
.mem_data_write(mem_data_write),
.mem_data_read(mem_data_read),
.mem_ready(mem_ready));

endmodule


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog实现两路组相联cache 的相关文章

  • 输入延时(Input Delay)与输出延时(Output Delay)

    一 设置输入延时 Input Delay 1 不同的路径需要使用不同的约束 2 输入延时的定义 由下图可以看出Input Delay是以上游芯片的时钟发送沿为参考 上游的输出数据到达FPGA的外部输入端口之间的延迟 输入延迟 input d
  • win10下安装vivado 2018.3之后ise14.7 的impact 无法使用

    软件版本号 操作系统win10 ise14 7 vivado 2018 3 ise14 7 在win10里面问题总结 1 ise14 7 闪退问题 比较好解决 论坛上比较多的解决方法 2 ise 14 7 windows 10 版本的ise
  • TestBench编写_激励产生

    TestBench编写 激励产生 TestBench编写 激励产生 基本背景 读取函数介绍 a fopen函数使用 b fread函数使用 c fclose函数使用 实际使用 TestBench编写 激励产生 基本背景 最近遇到项目中需要对
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • libero-soc许可证申请和环境配置

    环境 64位机 在哪台电脑上安装libero soc 就用哪台电脑申请许可证 1 注册 https www microsemi co 在官网注册 之后申请的许可证会发到注册时填写的邮箱 2 申请许可证 https www microsemi
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 【ZYNQ学习】PL第一课

    这节课讲什么 这节课的名字本来是想写为LED 但这一课里除了LED也有按键 又想换为GPIO控制 但关于PL的GPIO控制 不应该这么草率和简单 而且这一课有很多和ZYNQ或者PL关联性不强的东西要说 所以我写了删删了写改了好几遍 终于定为
  • 串口通信知识点总结

    串口是串行接口 serial port 的简称 也称为串行通信接口或COM接口 串口通信是指采用串行通信协议 serial communication 在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式 串口按电气标准及协议来划分
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 映射 MMIO 区域写回不起作用

    我希望对 PCIe 设备的所有读写请求都由 CPU 缓存进行缓存 然而 它并没有像我预期的那样工作 这些是我对回写 MMIO 区域的假设 对 PCIe 设备的写入仅在缓存回写时发生 TLP 有效负载的大小是缓存块大小 64B 然而 捕获的

随机推荐

  • BeanUtils.copyProperties的使用(浅拷贝)

    BeanUtils copyProperties的使用场景 将一个 Java 对象的属性值复制到另一个对象中 解决方法通常有2种方法 一个一个set 用BeanUtils copyProperties 很显然BeanUtils更加方便 代码
  • python中permute_PyTorch中permute的用法详解

    permute dims 将tensor的维度换位 参数 参数是一系列的整数 代表原来张量的维度 比如三维就有0 1 2这些dimension 例 import torch import numpy as np a np array 1 2
  • js-ajax

    一 ajax Asynchronous Javasript And Xml 通过Ajax向服务器请求数据 在不刷新整个页面的情况下 更新页面的内容 二 Ajax的创建 三步走 1 创建XMLHttpRequest对象 用来和服务器进行数据交
  • hdu1827Summer Holiday【tarjan强连通分量解决最小联系费用】

    1A 撒花 这比买买买开心多了 思路 既然是强连通分量的题 很容易想到形成的东西是一坨一坨的 哈哈 然后如果某一坨入度为0 那么很不幸 这一坨只能直接被威士忌通知 至于具体通知这一坨中的哪一个 枚举一遍就知道了 最后把话费求和 感觉强连通分
  • python程序运行提示Process finished with exit code -1073741819 (0xC0000005),程序终止运行...

    这个错误代码是表示程序运行时发生了访问冲突 通常是由于程序尝试访问不属于它的内存空间导致的 这可能是由于程序代码本身存在 bug 也可能是因为计算机环境问题造成的 为了解决这个问题 需要调查程序的代码 找出导致访问冲突的原因 然后修改代码以
  • 笔试题目收集(3)

    笔试题目搜集系列推荐 1 笔试题目搜集1 2 笔试题目收集2 3 笔试题目搜集3 4 笔试题目搜集4 5 笔试题目搜集5 1 下列程序输出结果 typedef union long i int k 5 char c DATE struct
  • 使用R语言进行数据对象获取的mget函数实战

    使用R语言进行数据对象获取的mget函数实战 在R语言中 我们经常需要获取由多个数据对象组成的列表 为了高效地获取这些对象 R提供了一个非常方便的函数 即mget函数 mget函数可以根据给定的对象名称 在当前环境中查找并返回相应的数据对象
  • 多类别属性预测深度架构GlideNet

    将属性 如颜色 形状 状态 动作 附加到对象类别是一个重要的计算机视觉问题 属性预测最近取得了令人振奋的进展 通常被表述为一个多标签分类问题 然而 在以下方面仍然存在重大挑战 1 预测多个对象类别上的大量属性 2 建模属性的类别依赖性 3
  • java pager,Pager 分页设计

    分页是非常基础又重复度高的功能 不论是前台 后台 或是手机版都有分页的需求 这里介绍Pager及相关代码 Pager是分页数据的封装 必要时需要与其他分页对象适配 PageObject Pageable等 详见PagerUtil publi
  • IO输入溢出(转载+整理)

    gets 防止缓冲区溢出 描述了高水平的缓冲区溢出攻击 以及讨论了为什么缓冲区溢出是如此严重的安全性问题 本专栏文章的主题是 通过防御性编程保护代码不受缓冲区溢出攻击 我们将论及 C编程语言中的主要安全性陷阱 显示应该避免特殊构造的原因 以
  • Bad owner or permissions on /root/.ssh/config

    vmware centos 部署 hadoop集群 启动hadoop节点 报错Bad owner or permissions on root ssh config 原因 SSH关于公钥认证Permission denied的问题 不能直接
  • 安装好后如何查看mysql/apache/nginx/php安装参数

    查看mysql编译参数 cat usr local mysql bin mysqlbug grep CONFIGURE LINE 查看apache编译参数 cat apachehome build config nice 查看php编译参数
  • 《机器学习》二刷超详细笔记

    博主在4月学完西瓜书时 一头雾水 觉得还是一知半解 9月开学后上完了必修的 machine learning 课程 并且自己编程实现了多种机器学习算法和论文复现后 才对机器学习有一点了解 现在再次翻阅西瓜书 很多知识点看到都豁然开朗 所以出
  • Debian 某些程序无法使用中文输入法设置方法

    debian系统下发现某些程序不能写入中文 下面是我解决的方法 sudo apt get install fcitx frontend qt5 1 我们可以通过在命令行下输入 dpkg L fcitx frontend qt5 1 修改配置
  • 如何解决apt-get中Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify的问题

    在Ubuntu中用apt get安装软件 系统报出Unmet dependencies错误 Unmet dependencies Try apt fix broken install with no packages or specify
  • 【Python-Anaconda】在anaconda中创建、激活虚拟环境;在anaconda中所创建的虚拟环境中安装OpenCv;如何在jupter notebook中使用所创建的虚拟环境

    一 在anaconda中创建虚拟环境 1 为什么要创建虚拟环境 答 为了避免库依赖冲突 所以在安装pytorch tensflow等时最好创建虚拟环境进行安装 2 创建虚拟环境步骤 1 打开anaconda prompt 输入如下代码 co
  • 基于AJAX技术提高搜索引擎排名

    描述 嵌入在你的web页面中的导航元素能够降低你的搜索引擎评价排名并且降低你的网站的响应性能 本文作者想同你一起探讨如何使用AJAX技术来解决这两个问题 许多设计良好的web站点都包含大量的与实际内容相联系的可导航信息 用于导航的HTML标
  • 【C++】抽象类

    2023年8月25日 周五上午 目录 声明抽象类 抽象类的特点 举例说明 声明抽象类 要在C 中声明一个抽象类 要求类中至少有一个纯虚函数 在C 中 一个类如果包含至少一个纯虚函数 那么这个类就被称为抽象类 总结起来 抽象类是一个包含至少一
  • 了解如何在20分钟内创建您的第一个Angular应用

    Angular is a JavaScript framework created my Misko Hevery and maintained by Google It s an MVC Model View Vontroller You
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag