MIPS/src/Gadgets.sv
Paul Pan 6fe89863b0 1. tlb test PASS
2. testbench.sv

Co-authored-by: cxy004 <cxy004@qq.com>
2021-08-13 18:28:04 +08:00

264 lines
5.3 KiB
Systemverilog

module ffen #(
parameter WIDTH = 8
) (
input logic clk,
input logic [WIDTH-1:0] d,
input logic en,
output logic [WIDTH-1:0] q
);
always_ff @(posedge clk) if (en) q <= d;
endmodule
module ffenr #(
parameter WIDTH = 8
) (
input logic clk,
input logic rst,
input logic [WIDTH-1:0] d,
input logic en,
output logic [WIDTH-1:0] q
);
always_ff @(posedge clk)
if (rst) q <= {WIDTH{1'b0}};
else if (en) q <= d;
endmodule
module ffenrc #(
parameter WIDTH = 8
) (
input logic clk,
input logic rst,
input logic [WIDTH-1:0] d,
input logic en,
input logic c,
output logic [WIDTH-1:0] q
);
always_ff @(posedge clk)
if (rst) q <= {WIDTH{1'b0}};
else if (en) q <= c ? {WIDTH{1'b0}} : d;
endmodule
module mux2 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic s,
output logic [WIDTH-1:0] q
);
assign q = s ? d1 : d0;
endmodule
module mux3 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [ 1:0] s,
output logic [WIDTH-1:0] q
);
assign q = s[1] ? d2 : s[0] ? d1 : d0;
endmodule
module mux4 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [WIDTH-1:0] d3,
input logic [ 1:0] s,
output logic [WIDTH-1:0] q
);
assign q = s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0;
endmodule
module mux5 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [WIDTH-1:0] d3,
input logic [WIDTH-1:0] d4,
input logic [ 2:0] s,
output logic [WIDTH-1:0] q
);
assign q = s[2] ? d4 : s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0;
endmodule
module mux6 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [WIDTH-1:0] d3,
input logic [WIDTH-1:0] d4,
input logic [WIDTH-1:0] d5,
input logic [ 2:0] s,
output logic [WIDTH-1:0] q
);
always_comb begin
case (s)
3'b000: q = d0;
3'b001: q = d1;
3'b010: q = d2;
3'b011: q = d3;
3'b100: q = d4;
default: q = d5;
endcase
end
endmodule
module prio_mux4 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [WIDTH-1:0] d3,
input logic [ 2:0] s,
output logic [WIDTH-1:0] q
);
assign q = s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0;
endmodule
module prio_mux5 #(
parameter WIDTH = 8
) (
input logic [WIDTH-1:0] d0,
input logic [WIDTH-1:0] d1,
input logic [WIDTH-1:0] d2,
input logic [WIDTH-1:0] d3,
input logic [WIDTH-1:0] d4,
input logic [ 3:0] s,
output logic [WIDTH-1:0] q
);
assign q = s[3] ? d4 : s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0;
endmodule
module onehot_bin4 (
input logic [3:0] onehot,
output logic [1:0] bin
);
assign bin = {onehot[3] | onehot[2], onehot[3] | onehot[1]};
endmodule
module onehot_bin8 (
input logic [7:0] onehot,
output logic [2:0] bin
);
logic [1:0] bin1, bin0;
onehot_bin4 onehot_bin4_1(onehot[7:4], bin1);
onehot_bin4 onehot_bin4_0(onehot[3:0], bin0);
assign bin = {|{onehot[7:4]}, bin1 | bin0};
endmodule
module onehot_bin16 (
input logic [15:0] onehot,
output logic [ 3:0] bin
);
logic [2:0] bin1, bin0;
onehot_bin8 onehot_bin8_1(onehot[15:8], bin1);
onehot_bin8 onehot_bin8_0(onehot[ 7:0], bin0);
assign bin = {|{onehot[15:8]}, bin1 | bin0};
endmodule
module onehot_bin32 (
input logic [31:0] onehot,
output logic [ 4:0] bin
);
logic [3:0] bin1, bin0;
onehot_bin16 onehot_bin16_1(onehot[31:16], bin1);
onehot_bin16 onehot_bin16_0(onehot[15: 0], bin0);
assign bin = {|{onehot[31:16]}, bin1 | bin0};
endmodule
module extender #(
parameter OWIDTH = 8,
parameter IWIDTH = 8
) (
input logic [IWIDTH-1:0] d,
input logic s,
output logic [OWIDTH-1:0] q
);
assign q = {{(OWIDTH - IWIDTH) {s & d[IWIDTH-1]}}, d};
endmodule
module buffer0 #(
parameter WIDTH = 8
) (
input clk,
input rst,
input logic [WIDTH-1:0] data,
input logic en,
output logic [WIDTH-1:0] bdata
);
logic [WIDTH-1:0] data1;
ffenr #(WIDTH) data_ff (
clk,
rst,
data,
en,
data1
);
assign bdata = en ? data : data1;
endmodule
module buffer #(
parameter WIDTH = 8
) (
input clk,
input rst,
input logic prev_valid,
input logic [WIDTH-1:0] prev_data,
input logic next_en,
output logic next_valid,
output logic [WIDTH-1:0] next_data
);
logic valid;
logic [WIDTH-1:0] data;
ffenr #(1) valid_ff (
clk,
rst,
prev_valid,
prev_valid ^ next_en,
valid
);
ffen #(WIDTH) data_ff (
clk,
prev_data,
prev_valid,
data
);
assign next_valid = valid | prev_valid;
assign next_data = valid ? data : prev_data;
endmodule