veosat

  • 🏠首页
  • ✒️随笔
    • 一生一芯
    • 数字设计
  • 📝日志
  • 🗂️归档
  • ♊留言
  • 2025-11-27
    2025-11-25
    应该是我的记忆产生了错乱,npc应该是没有调通rt-thread的,因为npc使用的cte函数都还没有实现完成。今天算是把总线这里实现完了,现在可以用printf了。
  • 2025-10-21
    一生一芯学习记录
    一生一芯学习记录表格
  • 2025-11-21
    仲裁器
    每个请求的优先级是固定的。如果按照优先级顺序重新排列,问题转化为在一个向量中找出最低位(或者最高位)的1。根据这一特性,固定优先级仲裁器可以借助补码的特点来实现:从低位到高位找到一个向量第一个为1的位置,该位置不变,之后直到最高位所有的位都取反就能得到一个数的补码。这个特点也很好理解,因为这样的两个数相加结果恰好是0并且产生一位进位。所以一个数和他的补码按位与就能得到一个独热码,这个独热码1的位置
  • 2025-11-21
    2025-11-21
    把npc的存储器都改成axi-lite接口后rt-thread跑不了了,奇怪的是difftest也没有报错
  • 2025-11-20
    2025-11-20
    终于又重新开始回到YSYX上了,中间回了一趟老家,再加上人又有点错乱,耽误了一段时间。 在阅读了AXI文档的一部分之后开始将npc改造成axi-lite接口。之前的修改其实都是生搬硬套,所以我重新组织了npc的结构。现在的npc分为3级:取指,译码执行,写回。这三部分通过valid-ready握手,取指部分通过axi-lite从外部的rom读取指令,当复位释放或者执行和写回部分ready后,取指部
  • 2025-11-20
    密码保护:浪费时间
    这是一篇受保护的文章,输入密码后才能查看哈
  • 2025-11-17
    AXI-Lite
    学习一下Vivado的AXI-Lite Slave端代码。通过Vivado创建新的IP并且选择添加AXI Wrapper就会看到Vivado提供的AXI-Lite代码,下面逐项分析这段示例代码。 AWREADY生成逻辑如下 always@(posedge S_AXI_ACLK)begin if(S_AXI_ACLK == 1\'b0)begin axi_awready <= 1\'b0; aw_
  • 2025-11-06
    verilator使用指南
    最近在做一生一芯项目,项目中RTL仿真使用的是Verilator,写这篇博客是为了整理一下Verilator的使用方法 Verilator是一个开源的Verilog仿真工具,verilator是编译型仿真器,类似于Synopsys的VCS。Verilator会将Verilog代码编译成cpp文件,然后添加一个cpp wrapper编译出可执行文件完成仿真 Verilator需要待仿真的Verilo
  • 2025-11-19
    日志-dummy
    测试文本。
  • 2025-11-15
    AMBA-APB
    APB是Advanced Peripheral Bus的缩写,APB是AMBA总线协议中最简单的一个,从名字也能看出这个总线是用在外设上的,一半是一些低速外设,例如UART等等。我认为理解APB的核心就是理解握手,而且握手在AHB和AXI中都会用到,其实握手也是一种思想一种方法,不仅在AMBA中有用,在其他领域也有使用。 APB的握手是通过master发出的PENABLE和PSEL信号和slave
  • 2025-10-28
    2025-10-28
    键盘实现也很简单,代码如下 需要注意从寄存器获取的值最高位代表是按下还是松开,需要去掉最高位再返回给应用程序,否则会产生数组越界。 VGA这部分做起来意外的顺利。屏幕大小寄存器就是vgactl_port_base寄存器,宽度在高16位,高度在低16位,那么自然同步寄存器就是vga_port_base了,按照nemu中vga的注释,同步寄存器这样使用 一开始我以为这个也要做成回调函数,但
  • 2025-11-04
    2025-11-03
    目前NPC的整体架构图如下
  • 2025-11-10
    2025-11-10
    今天将ROM和SRAM都做成和实际电路同样行为的模型,修改了difftest的位置,下一步就是在npc上实现axi-lite接口的存储器了。
  • 2025-11-04
    2025-11-04(ALU)
    在NPC上运行RT-Thread的时候,通过difftest发现NPC和NEMU在运行bgeu指令时出现了结果不一致,经过检查发现是NPC的实现有问题,主要是ALU这里实现的有问题。现在ALU的主要代码如下 现在的电路只对比较置位(slt,slti,sltiu)设置了比较,而对与条件跳转bge,bgeu,blt,bltu,现在的电路是让ALU执行减法运算然后检查ALUResult的31位,这种实现
  • 2025-10-26
    2025-10-25
    Dhrystone测试中Timer应该是有点问题,循环次数设置成500000次运行的时间还是0ms,这是不可能的。
  • 2025-10-28
    2025-10-27
    发现一个奇怪的现象,timer返回值发生在回调函数被调用之前,这样应用程序永远没法获得最新的时间。 原先nemu的timer回调函数如下 代码第3行表示读高地址时才更新时间,这样的问题是如果只读时间的低32位则时间就永远是初始时间,去掉地址的判断,把第3行改成下面的代码 系统就可以正常工作了。这里其实我早就注意到了,对timer工作方式也理解了,但是竟然一直没觉得这样是不对的。 总结一下am-ke
  • 2025-10-31
    2025-10-31
    RT-Thread这里,为什么传参是个问题呢? kcontext把函数的地址,参数等上下文数据都保存在了栈底,然后返回这个上下文的地址。yield( )开始执行后,会跳转到__am_asm_trap这个函数开始执行,__am_asm_trap函数是用汇编写的,它首先会把上下文保存到栈中,然后把栈指针放到$a0寄存器,再调用__am_irq_handle函数,这个函数的参数是上下文指针,实际上就是$
  • 2025-10-30
    2025-10-30
    要学习一下riscv汇编函数调用参数选择的规则。 实现上下文切换 按照讲义里的提示做就可以,也就是在调用__am_irq_handle完成之后,先修改栈指针的位置再恢复现场。那么问题就是调用__am_irq_handle结束之后这个新的上下文指针在哪里呢?如果熟悉riscv汇编的话应该能知道这个返回值的位置,或者查看反汇编代码也能知道这个值就在寄存器$a0里 所以只需要在调用__am_irq_ha
  • 2025-10-29
    2025-10-29
    riscv通过ecall指令发起自陷,ecall指令会将将pc跳转到mtvec寄存器中的地址。程序通过cte_init将异常处理函数注册到mtvec寄存器中,同时将应用程序传来的处理函数句柄保存下来。mtvec中保存的程序地址是在汇编中定义的__am_asm_trap函数,这个函数里面会调用句柄中的函数。现在我不明白的是mtvec这个寄存器要放到哪里呢? ->答案就是有物理寄存器,跟32个通
  • 2025-10-26
    2025-10-26
    今天测试microbench的时候出现了更奇怪的问题,在执行完一个测试项之后堆的结束地址竟然发生了变化,之前我发现很多问题是我自己实现的printf有问题导致的,所以这次我直接用putstr来打印信息,最后定位到堆结束是在一轮测试结束后打印测试时间时出错的,也就是还有可能是printf导致的,于是我把printf注释掉,果然就可以了。。 printf还需要重新写
  • 2025-10-24
    2025-10-24
    今天重新写了printf的实现, 关闭itrace,drystone就通过不了,进一步定位,只要没有反汇编就会出错。发现可能不是某一个,而是随机的。 原因是系统运行太快了,计算dhrystone的时候出现除0的问题,跟trace没有关系,添加了itrace后系统运行会变慢。问题是运行真的有这么快吗?
  • 2025-10-23
    2025-10-23
    一生一芯2025年10月23日日志
  • 2025-10-22
    2025-10-22
    一生一芯2025年10月22日学习日志
  • 2025-10-21
    世界,您好!
    为什么搭建这个博客
基于Wordpress. Theme By Document. ICP备案号 ICP备?????号