Move op_b mux to alu

This commit is contained in:
Olof Kindgren 2019-12-07 23:09:04 +01:00
parent b516c10d72
commit eb5d25ea1c
3 changed files with 14 additions and 16 deletions

View file

@ -5,7 +5,9 @@ module serv_alu
input wire i_rst,
input wire i_en,
input wire i_rs1,
input wire i_op_b,
input wire i_rs2,
input wire i_imm,
input wire i_op_b_rs2,
input wire i_buf,
input wire i_init,
input wire i_cnt_done,
@ -38,7 +40,8 @@ module serv_alu
wire plus_1;
wire b_inv_plus_1;
assign shamt_ser = i_sh_right ? i_op_b : b_inv_plus_1;
wire op_b = i_op_b_rs2 ? i_rs2 : i_imm;
assign shamt_ser = i_sh_right ? op_b : b_inv_plus_1;
shift_reg #(.LEN (5)) shamt_reg
(.clk (clk),
@ -70,13 +73,13 @@ module serv_alu
(
.clk (clk),
.rst (i_rst),
.a (~i_op_b),
.a (~op_b),
.b (plus_1),
.clr (!i_en),
.q (b_inv_plus_1),
.o_v (b_inv_plus_1_cy));
wire add_b = i_sub ? b_inv_plus_1 : i_op_b;
wire add_b = i_sub ? b_inv_plus_1 : op_b;
ser_add ser_add
(
@ -92,7 +95,7 @@ module serv_alu
(
.i_clk (clk),
.i_a (i_rs1),
.i_b (i_op_b),
.i_b (op_b),
.i_clr (!i_en),
.i_sign (i_cnt_done & !i_cmp_uns),
.o_q (result_lt));
@ -101,7 +104,7 @@ module serv_alu
assign o_cmp = i_cmp_eq ? result_eq : result_lt;
localparam [15:0] BOOL_LUT = 16'h8E96;//And, Or, =, xor
wire result_bool = BOOL_LUT[{i_bool_op, i_rs1, i_op_b}];
wire result_bool = BOOL_LUT[{i_bool_op, i_rs1, op_b}];
assign o_rd = (i_rd_sel == ALU_RESULT_ADD) ? result_add :
(i_rd_sel == ALU_RESULT_SR) ? result_sh :
@ -119,6 +122,6 @@ module serv_alu
en_r <= i_en;
end
assign result_eq = eq_r & (i_rs1 == i_op_b);
assign result_eq = eq_r & (i_rs1 == op_b);
endmodule

View file

@ -1,7 +1,3 @@
localparam [0:0]
OP_B_SOURCE_IMM = 1'd0,
OP_B_SOURCE_RS2 = 1'd1;
localparam[1:0]
ALU_RESULT_ADD = 2'd0,
ALU_RESULT_SR = 2'd1,

View file

@ -55,8 +55,6 @@ module serv_top
input wire [31:0] i_dbus_rdt,
input wire i_dbus_ack);
`include "serv_params.vh"
wire [4:0] rd_addr;
wire [4:0] rs1_addr;
wire [4:0] rs2_addr;
@ -212,6 +210,7 @@ module serv_top
.o_ctrl_pc_rel (pc_rel),
.o_ctrl_mret (mret),
//To alu
.o_op_b_source (op_b_source),
.o_alu_sub (alu_sub),
.o_alu_bool_op (alu_bool_op),
.o_alu_cmp_eq (alu_cmp_eq),
@ -239,7 +238,6 @@ module serv_top
.o_csr_d_sel (csr_d_sel),
//To top
.o_imm (imm),
.o_op_b_source (op_b_source),
.o_rd_csr_en (rd_csr_en),
.o_rd_alu_en (rd_alu_en));
@ -291,7 +289,6 @@ module serv_top
.o_ibus_cyc (o_ibus_cyc),
.i_ibus_ack (i_ibus_ack));
assign op_b = (op_b_source == OP_B_SOURCE_IMM) ? imm : rs2;
serv_alu alu
(
@ -299,7 +296,9 @@ module serv_top
.i_rst (i_rst),
.i_en (cnt_en),
.i_rs1 (rs1),
.i_op_b (op_b),
.i_rs2 (rs2),
.i_imm (imm),
.i_op_b_rs2 (op_b_source),
.i_buf (bufreg_q),
.i_init (init),
.i_cnt_done (cnt_done),