- 主题:问个cpu pc值的问题
看了好几本cpu的书,按我的理解,IF阶段传给IF/ID模块包括取到的指令和该指令的pc(即取指地址),因为后面处理跳转指令要用到这个pc,确实书上的意思也是这俩是对应的。
但是基本上所有书又是在IF的pc模块就:
always @ (posedge clk) begin
if (ce == `ChipDisable) begin
pc <= 32'h00000000;
end else begin
pc <=pc + 4'h4;
end
end
这儿似乎pc值已经+4,那跟刚取到的指令地址差4字节,那传递过去的指令和地址就不对应了。
确实也有看到是说传递新pc值
https://www.javaroad.cn/questions/343534#
但这应该不对。
或者可以这么理解:
因为IF的pc是wire连着IF/ID的if_pc,所以在现阶段IF/ID模块始终拿到现在的pc值,和取到的指令是对应的,只有到下个时钟上升边沿pc才会+4,所以相当于错开了,所以传递过去的不是新pc。
不知道我这样理解对不对,哪个大牛指点一下
--
FROM 125.33.204.*
PC是一个寄存器,用来确定IF要发起取指的地址(前面代码always块里的PC应该是这个PC寄存器);
在IF/ID(流水线级)之间存在中间寄存器,这些中间寄存器可能用来传递PC值,但是它不是PC寄存器。
不同的寄存器,按照各自的规则来赋值
【 在 liriver 的大作中提到: 】
: 看了好几本cpu的书,按我的理解,IF阶段传给IF/ID模块包括取到的指令和该指令的pc(即取指地址),因为后面处理跳转指令要用到这个pc,确实书上的意思也是这俩是对应的。
: 但是基本上所有书又是在IF的pc模块就:
: always @ (posedge clk) begin
: ...................
--
FROM 111.201.49.*
没看明白,IF/ID是寄存器,存放从IF阶段传过来的pc值(因为这个后面要用),问题是从IF传过来的是+4之前还是之后的,它里边传值逻辑是怎样的。当然我能看到的结论肯定是+4之前的值,但是在IF阶段+4的动作是怎么不影响往后传的pc值的
【 在 tianbing1212 的大作中提到: 】
: PC是一个寄存器,用来确定IF要发起取指的地址(前面代码always块里的PC应该是这个PC寄存器);
: 在IF/ID(流水线级)之间存在中间寄存器,这些中间寄存器可能用来传递PC值,但是它不是PC寄存器。
: 不同的寄存器,按照各自的规则来赋值
: ...................
--
FROM 125.33.204.*
--->PC------->IF/ID
| |
|--Add 4--|
寄存器写入发生在“->”位置
【 在 liriver 的大作中提到: 】
: 没看明白,IF/ID是寄存器,存放从IF阶段传过来的pc值(因为这个后面要用),问题是从IF传过来的是+4之前还是之后的,它里边传值逻辑是怎样的。当然我能看到的结论肯定是+4之前的值,但是在IF阶段+4的动作是怎么不影响往后传的pc值的
--
修改:tianbing1212 FROM 111.201.49.*
FROM 111.201.49.*
还是没看明白,我的理解对不对:
因为pc是寄存器,有两个锁存器,在当前时钟周期,后面的锁存器向IF/ID输出当前pc,而前面的锁存器+4(记为pc4),下个时钟时钟上升沿前面的锁存器的pc4传递到后面锁存器从而向IF/ID输出pc4,而前面的锁存器再+4(pc8)...循环往复
【 在 tianbing1212 的大作中提到: 】
--
FROM 125.33.204.*
IF/ID<=PC
PC<=PC+4
两个操作并行执行
【 在 liriver 的大作中提到: 】
: 还是没看明白,我的理解对不对:
: 因为pc是寄存器,有两个锁存器,在当前时钟周期,后面的锁存器向IF/ID输出当前pc,而前面的锁存器+4(记为pc4),下个时钟时钟上升沿前面的锁存器的pc4传递到后面锁存器从而向IF/ID输出pc4,而前面的锁存器再+4(pc8)...循环往复
--
FROM 111.201.49.*
看了《计算机组成与设计》,终于搞懂了,我的理解没错:当前时钟周期,if_pc取到pc的当前值,也就是当前取到的指令对应的地址,只有当上升沿到来时才会pc+4,下个时钟周期重复
--
FROM 125.33.204.*