mirror of
https://github.com/olofk/serv.git
synced 2025-04-20 03:47:09 -04:00
42 lines
988 B
Verilog
42 lines
988 B
Verilog
module serv_bufreg
|
|
(
|
|
input wire i_clk,
|
|
input wire i_cnt0,
|
|
input wire i_cnt1,
|
|
input wire i_en,
|
|
input wire i_init,
|
|
input wire i_loop,
|
|
input wire i_rs1,
|
|
input wire i_rs1_en,
|
|
input wire i_imm,
|
|
input wire i_imm_en,
|
|
input wire i_clr_lsb,
|
|
output reg [1:0] o_lsb,
|
|
output wire [31:0] o_dbus_adr,
|
|
output wire o_q);
|
|
|
|
wire c, q;
|
|
reg c_r;
|
|
reg [31:0] 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
|
|
//Clear carry when not in INIT state
|
|
c_r <= c & i_init;
|
|
|
|
if (i_en)
|
|
data <= {(i_loop & !i_init) ? o_q : q, data[31:1]};
|
|
|
|
if (i_cnt0 & i_init)
|
|
o_lsb[0] <= q;
|
|
if (i_cnt1 & i_init)
|
|
o_lsb[1] <= q;
|
|
end
|
|
|
|
assign o_q = data[0];
|
|
assign o_dbus_adr = {data[31:2], 2'b00};
|
|
|
|
endmodule
|