blob: 6e6e9c16cbd4c5a50811c32ed4f4cbbad1890226 [file] [log] [blame]
module BranchPredictionTable (
clk,
rst,
IN_readAddr,
OUT_taken,
IN_writeEn,
IN_writeAddr,
IN_writeTaken
);
parameter INDEX_LEN = 8;
parameter NUM_COUNTERS = 1 << INDEX_LEN;
input wire clk;
input wire rst;
input wire [INDEX_LEN - 1:0] IN_readAddr;
output wire OUT_taken;
input wire IN_writeEn;
input wire [INDEX_LEN - 1:0] IN_writeAddr;
input wire IN_writeTaken;
integer i;
reg [1:0] counters [NUM_COUNTERS - 1:0];
assign OUT_taken = counters[IN_readAddr][1];
always @(posedge clk)
if (rst) begin
`ifdef __ICARUS__
for (i = 0; i < NUM_COUNTERS; i = i + 1)
counters[i] <= 2'b10;
`endif
end
else if (IN_writeEn)
if (IN_writeTaken)
counters[IN_writeAddr] <= (counters[IN_writeAddr] == 2'b11 ? 2'b11 : counters[IN_writeAddr] + 1);
else
counters[IN_writeAddr] <= (counters[IN_writeAddr] == 2'b00 ? 2'b00 : counters[IN_writeAddr] - 1);
endmodule