| module serv_bufreg |
| ( |
| input wire i_clk, |
| //State |
| input wire i_cnt0, |
| input wire i_cnt1, |
| input wire i_en, |
| input wire i_init, |
| output reg [1:0] o_lsb, |
| //Control |
| input wire i_rs1_en, |
| input wire i_imm_en, |
| input wire i_clr_lsb, |
| input wire i_sh_signed, |
| //Data |
| input wire i_rs1, |
| input wire i_imm, |
| output wire o_q, |
| //External |
| output wire [31:0] o_dbus_adr); |
| |
| wire c, q; |
| reg c_r; |
| reg [31:2] data; |
| |
| wire clr_lsb = i_cnt0 & i_clr_lsb; |
| |
| assign {c,q} = {1'b0,(i_rs1 & i_rs1_en)} + {1'b0,(i_imm & i_imm_en & !clr_lsb)} + c_r; |
| |
| always @(posedge i_clk) begin |
| //Make sure carry is cleared before loading new data |
| c_r <= c & i_en; |
| |
| if (i_en) |
| data <= {i_init ? q : (data[31] & i_sh_signed), data[31:3]}; |
| |
| if (i_init ? (i_cnt0 | i_cnt1) : i_en) |
| o_lsb <= {i_init ? q : data[2],o_lsb[1]}; |
| |
| end |
| |
| assign o_q = o_lsb[0] & i_en; |
| assign o_dbus_adr = {data, 2'b00}; |
| |
| endmodule |