blob: 71aec50417a2f6bd11fecad2bdb5f7b3f423c1e8 [file] [log] [blame]
module hb_exp
#(parameter
HRQW=32,
HRSW=32,
RSTRT=0,
REND=7,
ADDRW = 3,
NTGT=REND-RSTRT+1,
ADDR_COMP = 0,
BASE_ADDR_VEC = 0,
ADDR_MASK_VEC = 0,
DFF_SAMPLES = 1
)(
input clk,
input areset_n,
input init_exp_rq,
input [ADDRW-1:0] init_exp_addr,
input [HRQW-1:0] init_exp_data,
input [NTGT-1:0] tgt_exp_ack,
input [NTGT-1:0] tgt_exp_err,
input [NTGT*HRSW-1:0] tgt_exp_data
);
wire [NTGT-1:0] exp_tgt_rq_samp_int ;
wire [NTGT-1:0] tgt_sel;
generate
if(ADDR_COMP==0) begin: GEN_IND_TREE
assign tgt_sel = addr_dec(init_hb_addr_ff);
end
else begin: GEN_REG_TREE
assign tgt_sel = addr_dec_comp(init_hb_addr_ff,BASE_ADDR_VEC,ADDR_MASK_VEC);
end
endgenerate
assign exp_tgt_rq_samp_int = {NTGT{init_exp_rq_ff}} & tgt_sel;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Functions
function [NTGT-1:0] addr_dec(input [ADDRW-1:0] f_addr);
integer i_tgt;
reg [NTGT-1:0] tgt_tmp;
begin
tgt_tmp={NTGT{1'b0}};
for(i_tgt=RSTRT;i_tgt<=REND;i_tgt=i_tgt+1) begin
if(f_addr==i_tgt) begin
tgt_tmp[i_tgt]=1'b1;
end
end
addr_dec=tgt_tmp;
end
endfunction
function [NTGT-1:0] addr_dec_comp(input [ADDRW-1:0] f_addr,input [NTGT*ADDRW-1:0] base_addr_in,input [NTGT*ADDRW-1:0] mask_in);
integer i_tgt;
reg [NTGT-1:0] tgt_tmp;
reg [ADDRW-1:0] base_addr_arr [NTGT-1:0];
reg [ADDRW-1:0] addr_mask_arr [NTGT-1:0];
reg [ADDRW-1:0] end_addr_arr [NTGT-1:0];
begin
for(i_tgt=RSTRT;i_tgt<=REND;i_tgt=i_tgt+1) begin
base_addr_arr[i_tgt]=base_addr_in[i_tgt*ADDRW +: ADDRW];
addr_mask_arr[i_tgt]=mask_in[i_tgt*ADDRW +: ADDRW];
end_addr_arr[i_tgt]=base_addr_arr[i_tgt] + addr_mask_arr[i_tgt];
end
tgt_tmp={NTGT{1'b0}};
for(i_tgt=RSTRT;i_tgt<=REND;i_tgt=i_tgt+1) begin
if((f_addr>=base_addr_arr[i_tgt])&&(f_addr<=end_addr_arr[i_tgt])) begin
tgt_tmp[i_tgt]=1'b1;
end
end
addr_dec_comp=tgt_tmp;
end
endfunction
endmodule