Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module pl_hazard_unit (input branchd, mtorfsele, mtorfselm, rfwee, rfwem, rfwew, jumpd,
- input [4:0] rsd, rtd, rse, rte, rfae, rfam, rfaw,
- output stall,
- output reg flush,
- output reg forwardad, forwardbd,
- output reg [1:0] forwardae, forwardbe);
- reg lwstall, bstall;
- always @(*) begin
- forwardad <= 0;
- forwardbd <= 0;
- forwardae <= 0;
- forwardbe <= 0;
- //execute operand 1
- if ((rse != 0) && (rse == rfam) && rfwem) forwardae <= 2'b10;
- else if ((rse != 0) && (rfwew) && (rse == rfaw)) forwardae <= 2'b01;
- else forwardae <= 2'b00;
- //execute operand 2
- if ((rte != 0) && (rse == rfam) && rfwem) forwardbe <= 2'b10;
- else if ((rte != 0) && (rfwew) && (rse == rfaw)) forwardbe <= 2'b01;
- else forwardbe <= 2'b00;
- //ID (branch) operand 1
- if ((rsd != 0) && (rsd == rfam) && (rfwem)) forwardad <= 1'b1;
- else forwardad <= 1'b0;
- //ID (branch) operand 2
- if ((rtd!= 0) && (rtd == rfam) && (rfwem)) forwardbd <= 1'b1;
- else forwardbd <= 1'b0;
- //lw stall (if LW is EX and dependent is in ID, stall 1 and flush the stage between)
- if ((mtorfsele && ((rte == rsd) || (rte == rtd)))) begin
- lwstall <= 1'b1;
- flush <= 1'b1;
- end
- else begin
- lwstall <= 1'b0;
- flush <= 1'b0;
- end
- //branch stall (if branch instr (in ID) is dependent on instr in EX, or LW in MEM, stall 1)
- if (((rsd == rfae) || (rtd == rfae)) && (branchd) && (rfwee) || ((rsd == rfam) || (rtd == rfam)) && (branchd) && (mtorfselm))
- bstall <= 1'b1;
- else bstall <= 1'b0;
- end
- assign stall = lwstall | bstall;
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement