指令解码器处理微控制器中寄存器常量的常见方式是什么?
What are the common ways instruction decoders deal with using constants over registers in microcontrollers?
具体来说,如果汇编指令有一个常量作为操作数之一,指令解码器如何将它传递给 ALU?目前我想到了三种方法。
- 将常量传递给空闲寄存器,然后将该寄存器的地址传递给 ALU。
- 在与地址相同的总线中传递常量,并单独触发一些使能 1 位总线以表示其常量。
- 有一个完全独立的常量总线和一个 1 位使能总线。
到目前为止,我看到了上述所有三种方法的缺点。
第一个强制跟踪“忙”寄存器,并且每个周期需要更多的时钟边沿使得 CPU 变慢。
第二个将常量的大小限制为地址总线的大小。
第三种增加了内部电路的复杂度
微控制器中的真实 CPU 是否使用这些方法中的任何一种?或者还有其他解决方案吗?如果是,它们是什么?
Pass the constant in the same bus as the address would go and separately trigger some enable 1-bit bus to signify its a constant.
您所描述的 1 位指示称为控制信号,多路复用器使用它来 select 在可能有多个输入时提供正确的输入。 MUX 是 select 或 — 它 select 在两个(或更多)选择之间。
在C语言表达式中,我们可能会写成ALUIn2 = Signal ? RegData2 : immediate
,表示在1位布尔值Signal
的控制下,选择某个寄存器数据值或立即数。我们会在 RegData2 = reg[source2Field]
和 immediate = signExtend(immField)
之前。 ?:
操作就是 MUX 所做的:select 从两个(或更多)选择中选择一个。
在多路复用器的选择中,往往一个输入完全不适用而另一个完全合适。虽然控制信号是动态的,但硬件正在做的是并行计算多个选项。它不会等到它知道哪一个是当前指令的正确选择,而是计算许多可能的事情,然后再选择正确的一个。因此,每个周期都在 ignored/discarded 进行许多并行计算。
然而,地址总线可能会被绕过,以便将这些数据项直接发送到 ALU(直接对 MUX 和其他逻辑取模,查找 and/or 符号扩展)。当一个数据项在两个组件之间传送时,我们通常不会认为那是总线,而是布线。但是,它可以满足总线的某些定义。
虽然常量的宽度限制仍然存在,但这在指令集体系结构和机器代码编码中很明显,并且是程序运行的问题 with/around。硬件只需要适应指令集的最大常量大小,它通常与数据大小相同(通常与地址大小相同)。
Have a completely separate bus for a constant, and a 1-bit enable bus.
一些处理器已经有一个总线用于一个或另一个 ALU 输入。常量将被授予访问该总线的权限。
其他处理器对 ALU 输入的接线会更简单,但这种接线会在几个选项之间进行选择,就像我上面说的那样,可以看作是一个 bus-like 实体。
Pass the constant into a free register and then pass the address of that register to the ALU.
- 处理器并不真正跟踪 free/busy 寄存器——这是(机器代码)程序的工作。 (这适用于架构寄存器,而不是重命名寄存器;还有一些 CPU 会广泛标记是否有任何浮点寄存器 in-use,以帮助加快不使用浮点数的进程的上下文切换)。
具体来说,如果汇编指令有一个常量作为操作数之一,指令解码器如何将它传递给 ALU?目前我想到了三种方法。
- 将常量传递给空闲寄存器,然后将该寄存器的地址传递给 ALU。
- 在与地址相同的总线中传递常量,并单独触发一些使能 1 位总线以表示其常量。
- 有一个完全独立的常量总线和一个 1 位使能总线。
到目前为止,我看到了上述所有三种方法的缺点。
第一个强制跟踪“忙”寄存器,并且每个周期需要更多的时钟边沿使得 CPU 变慢。
第二个将常量的大小限制为地址总线的大小。
第三种增加了内部电路的复杂度
微控制器中的真实 CPU 是否使用这些方法中的任何一种?或者还有其他解决方案吗?如果是,它们是什么?
Pass the constant in the same bus as the address would go and separately trigger some enable 1-bit bus to signify its a constant.
您所描述的 1 位指示称为控制信号,多路复用器使用它来 select 在可能有多个输入时提供正确的输入。 MUX 是 select 或 — 它 select 在两个(或更多)选择之间。
在C语言表达式中,我们可能会写成ALUIn2 = Signal ? RegData2 : immediate
,表示在1位布尔值Signal
的控制下,选择某个寄存器数据值或立即数。我们会在 RegData2 = reg[source2Field]
和 immediate = signExtend(immField)
之前。 ?:
操作就是 MUX 所做的:select 从两个(或更多)选择中选择一个。
在多路复用器的选择中,往往一个输入完全不适用而另一个完全合适。虽然控制信号是动态的,但硬件正在做的是并行计算多个选项。它不会等到它知道哪一个是当前指令的正确选择,而是计算许多可能的事情,然后再选择正确的一个。因此,每个周期都在 ignored/discarded 进行许多并行计算。
然而,地址总线可能会被绕过,以便将这些数据项直接发送到 ALU(直接对 MUX 和其他逻辑取模,查找 and/or 符号扩展)。当一个数据项在两个组件之间传送时,我们通常不会认为那是总线,而是布线。但是,它可以满足总线的某些定义。
虽然常量的宽度限制仍然存在,但这在指令集体系结构和机器代码编码中很明显,并且是程序运行的问题 with/around。硬件只需要适应指令集的最大常量大小,它通常与数据大小相同(通常与地址大小相同)。
Have a completely separate bus for a constant, and a 1-bit enable bus.
一些处理器已经有一个总线用于一个或另一个 ALU 输入。常量将被授予访问该总线的权限。
其他处理器对 ALU 输入的接线会更简单,但这种接线会在几个选项之间进行选择,就像我上面说的那样,可以看作是一个 bus-like 实体。
Pass the constant into a free register and then pass the address of that register to the ALU.
- 处理器并不真正跟踪 free/busy 寄存器——这是(机器代码)程序的工作。 (这适用于架构寄存器,而不是重命名寄存器;还有一些 CPU 会广泛标记是否有任何浮点寄存器 in-use,以帮助加快不使用浮点数的进程的上下文切换)。