OO Unit1 表达式解析
基于度量分析程序结构 类图 Unit1 最终版本的类图如上图所示。整个程序的核心思想采用了递归下降法,大体流程是:对于输入数据 input,先在 Main 方法中依次调用类 ComFunc 的 defineComFunc 静态方法和 RecFunc 的 defineRecFunc 静态方法,解析自定义普通函数和自定义递推函数,然后再解析待展开表达式:实例化一个 Lexer 对象,实现词法解析,并将解析的结果传递到 Parse 的实例对象,实现语法解析,解析得到一个 Expr 实例 expr,然后再将 expr 转为 Poly(由 Unit 构成)的多项式形式,并在转化的过程中实现表达式的计算(实体类 Poly 与 Unit)与化简(工具类 Simplify), 最后将结果作为字符串输出。 度量 IntelliJ IDEA 的插件 MetricsReloaded 帮助计算了以下方法度量值,故在此围绕这些度量进行分析。 CogC(Cognitive Complexity,认知复杂度) CogC 是通过代码中的逻辑分支(如...
P7 CPU设计文档
设计草稿 任务清单 流水线 CPU 为计时器模块(已实现)提供接口 创建系统桥模块,为 CPU 提供统一的访问外设的接口 创建协处理器 CP0模块,用于引导 CPU 执行异常处理程序 使 CPU 能够检测内部指令执行的错误 使 CPU 能够初步响应外部的中断信号 在 CPU 中实现一些异常处理需要执行的指令 注: CPU(包含 CP0)、Bridge 和 2 个计时器 Timer1、Timer2都是MIPS 微系统的组成部分,也即我们需要设计搭建的系统模块;而 DM 和中断产生器是外部的设备,由外部(testbench)传入,与我们无关。 对于 Bridge 来说,Timer1、Timer2 和 InterruptGenerator 是设备(外设),各自对应于一个 CPU逻辑地址空间(即0x0000_7F00∼0x0000_7F0B、0x0000_7F10∼0x0000_7F1B和0x0000_7F20∼0x0000_7F23);DM 是存储器,对应于 CPU逻辑地址空间的0x0000_0000∼0x0000_2FFF。(这里之所以称作逻辑地址空间,是因为这些地址其实是给...
P6 CPU设计文档
设计要求 处理器应为五级流水线设计,支持如下指令集: 12345add, sub, and, or, slt, sltu, luiaddi, andi, orilb, lh, lw, sb, sh, swmult, multu, div, divu, mfhi, mflo, mthi, mtlobeq, bne, jal, jr 请注意,所有运算类指令均暂不考虑因溢出而产生的异常。 除加减法外的指令均以指令集规定的行为为准,可参看 MIPS-C 指令集(该指令集描述针对单周期,注意单周期和流水线有些许指令行为描述不同,但最终结果是一致的),加减法按无符号处理(不考虑溢出)。若对本次实验有任何疑问请及时在讨论区提出。 设计草稿 新增指令 AT 信息 新增指令顺序: 先加入涉及 MUDI 的乘除法指令,完善相应的数据通路及(冒险)控制信号; 再加入涉及 ALU 的运算指令,对 ALU 做出相应修改; 再加入访存指令,新增 BE 扩展模块与 RE 扩展模块; 最后加入跳转指令,修改 CMP...
P5 CPU设计文档
设计草稿 流水线架构 数据通路 5 级流水 CPU 分为 5 个阶段:取指阶段(F),译码阶段(D),执行阶段(E),存储阶段(M),写回阶段(W)。通过在两个阶段之间加入寄存器,来保存在前一周期中的上一阶段所传来的数据,同时在后一周期中为下一阶段提供数据。无论是数据还是信号,都需要在寄存器中进行保存,直至不再需要。 下面先从增加流水线寄存器入手,完善数据通路: 相对 P4,需要修改的地方为: 新增流水线寄存器 NPC 模块输出 PC+4 改为输出 PC+8,并区分输入 F_PC 与 D_PC ALU 不再有 Zero 信号,并且将判断相等提前到对 E_GPR_RD1 与 E_GPR_RD2 新增比较器 译码器 采用集中式译码:在取指令(F 级)时或者读取寄存器阵列信息(D 级)前,将所有的控制信号全部解析出,然后让其随着流水往后逐级传递。 流水线冒险 在流水线系统中,多条指令同时执行,当一条指令依赖于还没有结束的另一条指令的结果时,将发生冒险(hazard),也被称为“冲突”。冒险的类型,主要有**结构冒险( Structural Hazard )、控制冒险(...
P4 CPU设计文档
设计要求 处理器为 32 位单周期处理器,不考虑延迟槽,应支持的指令集为:add, sub, ori, lw, sw, beq, lui, jal, jr, nop,其中: nop 为空指令,机器码 0x00000000,不进行任何有效行为(修改寄存器等)。 add, sub 按无符号加减法处理(不考虑溢出)。 需要采用模块化和层次化设计。顶层文件为 mips.v,有效的驱动信号要求包括且仅包括同步复位信号 reset 和时钟信号 clk,接口定义如下: 1234module mips( input clk, input reset); 设计草稿 数据通路模块定义 PC 信号名 方向 功能 NPC[31:0] I 输入下一个 PC 值 clk I 时钟信号 reset I 同步复位信号 PC[31:0] O 输出当前 PC 值 NPC 信号名 方向 功能 PC[31:0] I 输入当前的 PC 值,用于计算 NPC...
P3 CPU设计文档
设计草稿 设计要求 处理器为 32 位单周期处理器,应支持的指令集为:add, sub, ori, lw, sw, beq, lui, nop,其中: nop 为空指令,机器码 0x00000000,不进行任何有效行为(修改寄存器等)。 add, sub 按无符号加减法处理(不考虑溢出)。 需要采用模块化和层次化设计。顶层有效的驱动信号要求包括且仅包括异步复位信号 reset(clk 请使用内置时钟模块)。 可以将微体系结构分为两个相互作用的部分:数据通路(datapath)和控制(control)。 先根据应实现的指令对功能部件进行设计与搭建,然后再对各个功能部件进行连接,形成完整的数据通路。 数据通路搭建完毕后,再构造控制器,以根据读取的指令产生相应的控制信号。 数据通路 1 数据通路模块定义 先从包含状态元件的硬件开始,然后在这些存储组件之间增加组合逻辑基于当前状态计算新的状态。 1.1 程序计数器(PC) 32 位寄存器。输出 PC 指向当前指令,输入 PC’表示下一条指令的地址。 PC...
不同方式查看CUDA版本的含义
最近在给深度学习项目搭建环境时,遇到了不得不使用 CUDA 11.8 的情况,而我在通过不同方式查看自己 CUDA 版本时发现了不同版本号,产生了诸多疑惑(甚至差点卸载了 CUDA 重装)。经过一番探索以及向d老师寻求帮助后,终于理清了他们的关系,遂写下此文以帮助遇到同样问题的追光者们~(部分内容引用自DeepSeek,如有错误之处欢迎指出!) nvcc -V 该方式显示的是当前环境下 nvcc 对应的 CUDA 工具包(CUDA Toolkit)版本(如下面的 cuda_12.0 表示 CUDA Toolkit 版本为12.0): 12345nvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2023 NVIDIA CorporationBuilt on Fri_Jan__6_16:45:21_PST_2023Cuda compilation tools, release 12.0, V12.0.140Build cuda_12.0.r12.0/compiler.32267302_0 对于当前环境下的CUDA...












