本次主要分享宏文件E203_defines的组织方式和内部含义
ifdef E203_CFG_ADDR_SIZE_IS_16 表示如果宏 E203_CFG_ADDR_SIZE_IS_16 被定义,则编译器会选择这个代码分支。在这个分支中,会定义以下宏:
E203_ADDR_SIZE_IS_16:表示地址大小是 16 位
E203_PC_SIZE_IS_16:表示 PC(程序计数器)是 16 位
E203_ADDR_SIZE:表示地址大小为 16
E203_PC_SIZE:表示 PC 大小为 16
同理,ifdef E203_CFG_ADDR_SIZE_IS_32 和 ifdef E203_CFG_ADDR_SIZE_IS_24 分别表示如果宏 E203_CFG_ADDR_SIZE_IS_32 和 E203_CFG_ADDR_SIZE_IS_24 被定义,则编译器会选择相应的代码分支,初始化为24位或者32位。
这些宏定义了 E203 模块中一些重要的基地址和基地址所在的片区号等信息,包括:
E203_PPI_ADDR_BASE 和 E203_PPI_BASE_REGION:PPI(Perf Counter and Machine Status)模块的基地址和所在的片区号。
E203_CLINT_ADDR_BASE 和 E203_CLINT_BASE_REGION:CLINT(Core Local Interruptor)模块的基地址和所在的片区号。
E203_PLIC_ADDR_BASE 和 E203_PLIC_BASE_REGION:PLIC(Platform-Level Interrupt Controller)模块的基地址和所在的片区号。
E203_FIO_ADDR_BASE 和 E203_FIO_BASE_REGION:FIO(Fast IO)模块的基地址和所在的片区号。
E203_DTCM_ADDR_BASE 和 E203_ITCM_ADDR_BASE:DTCM(Data Tightly-Coupled Memory)和 ITCM(Instruction Tightly-Coupled Memory) 的基地址。
这段代码中定义了关于 ITCM 相关的宏。在这里,ITCM(Instruction Tightly-Coupled Memory)是一个指令紧密耦合的存储器模块。
首先,当 E203_CFG_HAS_ITCM 宏被定义时,表示该 SoC 系统支持 ITCM,会执行后续的代码定义对应的宏。接着根据 E203_CFG_ITCM_ADDR_WIDTH 宏定义的值计算 ITCM 的数据通路和地址宽度,并将结果分别赋给 E203_ITCM_RAM_DP 和 E203_ITCM_RAM_AW 的常量。然后,定义了 E203_ITCM_BASE_REGION 常量表示 ITCM 所在的片区号。
接着,根据 E203_CFG_ITCM_DATA_WIDTH_IS_64 宏是否定义,决定了 ITCM 的数据位宽和写入掩码宽度,并将结果分别赋给 E203_ITCM_DATA_WIDTH 和 E203_ITCM_WMSK_WIDTH 常量。同时,还定义了 E203_ITCM_RAM_ECC_DW 和 E203_ITCM_RAM_ECC_MW 常量表示 ECC 校验位的数据位宽和校验位位宽。
最后,根据是否定义了 E203_HAS_ECC 宏,决定了 ITCM 存储器的数据位宽、写入掩码位宽以及外部访问的延迟周期等信息。如果没有定义 E203_HAS_ECC,则将数据位宽和写入掩码位宽分别赋给 E203_ITCM_RAM_DW 和 E203_ITCM_RAM_MW 常量,且 E203_ITCM_OUTS_NUM 常量表示只允许有一个外部代理器的请求在 ITCM 存储器中等待。同时,还定义了 E203_HAS_ITCM_EXTITF 常量表示 ITCM 模块有外部接口。
这段代码中定义了关于乘除、加法的宏。
首先,当 E203_CFG_SUPPORT_SHARE_MULDIV 宏被定义时,表示该 SoC 系统支持共享乘除器并会执行后续代码定义对应的宏。接着定义了 E203_SUPPORT_MULDIV 和 E203_SUPPORT_SHARE_MULDIV 常量表示支持乘除和共享乘除器功能。
接下来,当 E203_CFG_SUPPORT_INDEP_MULDIV 宏被定义时,表示系统支持独立乘除器功能并会执行后续代码定义对应的宏。定义 E203_SUPPORT_MULDIV 常量表示支持乘除功能,并定义 E203_SUPPORT_INDEP_MUL_1CYC 常量表示独立乘法器能够在一个时钟周期内完成乘法运算。
最后,根据 E203_CFG_SUPPORT_SHARE_MULDIV 常量是否被定义,决定了 ALU(Arithmetic Logic Unit,算术逻辑单元)模块的加法器位宽。如果支持共享乘除器,则将相应乘除器的输出位宽作为加法器的位宽;否则将 E203_XLEN+1 赋给 E203_ALU_ADDER_WIDTH 常量,表示 ALU 的加法器有 33 位宽度。
这段代码定义了关于乘除的宏命令,主要是定义了一些乘除指令的边界位,以及乘除操作的总位数 E203_DECINFO_MULDIV_WIDTH。
通常,在计算机中进行乘法和除法时,需要将运算操作的数值按位拆分,并将其表示为二进制数,然后进行一系列的逻辑运算。这些宏命令定义的数值就是用来辅助实现这些逻辑运算的。
具体而言,这里定义了 E203_DECINFO_MULDIV_MUL、E203_DECINFO_MULDIV_MULH、E203_DECINFO_MULDIV_MULHSU、E203_DECINFO_MULDIV_MULHU、E203_DECINFO_MULDIV_DIV、E203_DECINFO_MULDIV_DIVU、E203_DECINFO_MULDIV_REM、E203_DECINFO_MULDIV_REMU 和 E203_DECINFO_MULDIV_B2B 等宏,分别表示乘法结果的最低位、次高位、无符号乘法结果的次高位、有符号乘法结果的次高位、带符号除法、无符号除法、带符号余数、无符号余数和加减进位标志等。
而 E203_DECINFO_MULDIV_WIDTH 则表示整个乘除操作所需的位数,即上述各个宏位宽之和。在实际设计中,这些宏位所占的位数需要根据具体的乘除操作而定,因此可以通过定义不同的宏命令来实现不同位宽的乘除运算。