Moved serv to own tree
This commit is contained in:
59
rtl/serv/serv_mem_if.v
Normal file
59
rtl/serv/serv_mem_if.v
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* serv_mem_if.v : SERV memory interface
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Olof Kindgren <olof@award-winning.me>
|
||||
* SPDX-License-Identifier: ISC
|
||||
*/
|
||||
`default_nettype none
|
||||
module serv_mem_if
|
||||
#(
|
||||
parameter [0:0] WITH_CSR = 1,
|
||||
parameter W = 1,
|
||||
parameter B = W-1
|
||||
)
|
||||
(
|
||||
input wire i_clk,
|
||||
//State
|
||||
input wire [1:0] i_bytecnt,
|
||||
input wire [1:0] i_lsb,
|
||||
output wire o_misalign,
|
||||
//Control
|
||||
input wire i_signed,
|
||||
input wire i_word,
|
||||
input wire i_half,
|
||||
//MDU
|
||||
input wire i_mdu_op,
|
||||
//Data
|
||||
input wire [B:0] i_bufreg2_q,
|
||||
output wire [B:0] o_rd,
|
||||
//External interface
|
||||
output wire [3:0] o_wb_sel);
|
||||
|
||||
reg signbit;
|
||||
|
||||
wire dat_valid =
|
||||
i_mdu_op |
|
||||
i_word |
|
||||
(i_bytecnt == 2'b00) |
|
||||
(i_half & !i_bytecnt[1]);
|
||||
|
||||
assign o_rd = dat_valid ? i_bufreg2_q : {W{i_signed & signbit}};
|
||||
|
||||
assign o_wb_sel[3] = (i_lsb == 2'b11) | i_word | (i_half & i_lsb[1]);
|
||||
assign o_wb_sel[2] = (i_lsb == 2'b10) | i_word;
|
||||
assign o_wb_sel[1] = (i_lsb == 2'b01) | i_word | (i_half & !i_lsb[1]);
|
||||
assign o_wb_sel[0] = (i_lsb == 2'b00);
|
||||
|
||||
always @(posedge i_clk) begin
|
||||
if (dat_valid)
|
||||
signbit <= i_bufreg2_q[B];
|
||||
end
|
||||
|
||||
/*
|
||||
mem_misalign is checked after the init stage to decide whether to do a data
|
||||
bus transaction or go to the trap state. It is only guaranteed to be correct
|
||||
at this time
|
||||
*/
|
||||
assign o_misalign = WITH_CSR & ((i_lsb[0] & (i_word | i_half)) | (i_lsb[1] & i_word));
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user