Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
CAOS_HW
HDL_IP
SafeSU
Commits
fe779333
Commit
fe779333
authored
Feb 10, 2022
by
Guillem Cabo
Browse files
Renamed some parameters, so that the parameters’ names are the same with the...
parent
3832d194
Changes
4
Expand all
Show whitespace changes
Inline
Side-by-side
hdl/PMU_raw.sv
View file @
fe779333
This diff is collapsed.
Click to expand it.
hdl/pmu_ahb.sv
View file @
fe779333
This diff is collapsed.
Click to expand it.
tb/questa_sim/tb_pmu_ahb/tb_pmu_ahb.sv
View file @
fe779333
/* -----------------------------------------------
* Project Name : MCCU research
* File : tb_pmu_
raw
.sv
_
* File : tb_pmu_
ahb
.sv
* Organization : Barcelona Supercomputing Center
* Author(s) : Guillem cabo
* Email(s) : guillem.cabo@bsc.es
...
...
@@ -23,69 +23,71 @@
//***Test bench***
module
tb_pmu_ahb
();
//***Parameters***
parameter
CLK_PERIOD
=
2
;
parameter
CLK_HALF_PERIOD
=
CLK_PERIOD
/
2
;
parameter
CLK_PERIOD
=
2
;
parameter
CLK_HALF_PERIOD
=
CLK_PERIOD
/
2
;
//***DUT parameters***
parameter
TB_
DATA
_WIDTH
=
32
;
parameter
TB_N_COUNTERS
=
24
;
parameter
TB_N_SOC_EV
=
32
;
parameter
TB_
N_CFG
=
1
;
parameter
TB_N_CO
RES
=
4
;
//WARNIGN: if N_counters or cores change this value needs to change
parameter
TB_
TOTAL_NREGS
=
47
;
parameter
FT
=
0
;
parameter
TB_
REG
_WIDTH
=
32
;
parameter
TB_N_COUNTERS
=
24
;
parameter
TB_N_SOC_EV
=
128
;
parameter
TB_
MCCU_N_CORES
=
6
;
parameter
TB_N_CO
NF_REGS
=
1
;
parameter
TB_MCCU_WEIGHTS_WIDTH
=
8
;
parameter
TB_
MCCU_N_EVENTS
=
2
;
parameter
FT
=
0
;
//***Signals***
reg
clk_i
;
reg
rstn_i
;
reg
[
TB_N_SOC_EV
-
1
:
0
]
events_i
;
//AHB signals
reg
hsel_i
;
reg
hwrite_i
;
reg
[
TB_DATA_WIDTH
-
1
:
0
]
haddr_i
;
reg
[
TB_DATA_WIDTH
-
1
:
0
]
hwdata_i
;
reg
[
1
:
0
]
htrans_i
;
wire
[
1
:
0
]
hresp_o
;
wire
[
TB_DATA_WIDTH
-
1
:
0
]
hrdata_o
;
wire
hreadyo_o
;
reg
[
TB_N_SOC_EV
-
1
:
0
]
events_i
;
//AHB signals
reg
hsel_i
;
reg
hwrite_i
;
reg
[
TB_REG_WIDTH
-
1
:
0
]
haddr_i
;
reg
[
TB_REG_WIDTH
-
1
:
0
]
hwdata_i
;
reg
[
1
:
0
]
htrans_i
;
wire
[
1
:
0
]
hresp_o
;
wire
[
TB_REG_WIDTH
-
1
:
0
]
hrdata_o
;
wire
hreadyo_o
;
//store name of test for easier debug of waveform
reg
[
64
*
8
:
0
]
tb_test_name
;
reg
tb_fail
=
0
;
reg
[
64
*
8
:
0
]
tb_test_name
;
reg
tb_fail
=
0
;
//***Module***
pmu_ahb
#
(
.
haddr
(
32'h80100000
),
.
hmask
(
32'hfff
),
.
REG_WIDTH
(
32
),
.
N_REGS
(
TB_TOTAL_NREGS
),
.
MCCU_N_CORES
(
4
),
.
N_SOC_EV
(
TB_N_SOC_EV
),
.
FT
(
FT
)
.
haddr
(
32'h80100000
),
.
hmask
(
32'hfff
),
.
REG_WIDTH
(
TB_REG_WIDTH
),
.
N_COUNTERS
(
TB_N_COUNTERS
),
.
N_SOC_EV
(
TB_N_SOC_EV
),
.
MCCU_N_CORES
(
TB_MCCU_N_CORES
),
.
N_CONF_REGS
(
TB_N_CONF_REGS
),
.
MCCU_WEIGHTS_WIDTH
(
TB_MCCU_WEIGHTS_WIDTH
),
.
MCCU_N_EVENTS
(
TB_MCCU_N_EVENTS
),
.
FT
(
FT
)
)
dut_pmu_ahb
(
.
rstn_i
(
rstn_i
),
.
clk_i
(
clk_i
),
.
hsel_i
(
hsel_i
),
.
hreadyi_i
(
1'b1
),
.
haddr_i
(
haddr_i
),
.
hwrite_i
(
hwrite_i
),
.
htrans_i
(
htrans_i
),
.
hsize_i
(
3'b0
),
.
hburst_i
(
3'b0
),
.
hwdata_i
(
hwdata_i
),
.
hprot_i
(
4'b0
),
.
hmastlock_i
(
1'b0
),
.
hreadyo_o
(
hreadyo_o
),
.
hresp_o
(
),
.
hrdata_o
(
hrdata_o
),
.
events_i
(
events_i
),
.
intr_overflow_o
(
),
.
intr_quota_o
(
),
.
intr_MCCU_o
(
),
.
intr_RDC_o
(
),
.
intr_FT1_o
(
),
.
intr_FT2_o
(
)
.
rstn_i
(
rstn_i
),
.
clk_i
(
clk_i
),
.
hsel_i
(
hsel_i
),
.
hreadyi_i
(
1'b1
),
.
haddr_i
(
haddr_i
),
.
hwrite_i
(
hwrite_i
),
.
htrans_i
(
htrans_i
),
.
hsize_i
(
3'b0
),
.
hburst_i
(
3'b0
),
.
hwdata_i
(
hwdata_i
),
.
hprot_i
(
4'b0
),
.
hmastlock_i
(
1'b0
),
.
hreadyo_o
(
hreadyo_o
),
.
hresp_o
(
),
.
hrdata_o
(
hrdata_o
),
.
events_i
(
events_i
),
.
intr_overflow_o
(
),
.
intr_quota_o
(
),
.
intr_MCCU_o
(
),
.
intr_RDC_o
(
),
.
intr_FT1_o
(
),
.
intr_FT2_o
(
)
);
//***clk_gen***
...
...
@@ -96,12 +98,12 @@ reg tb_fail = 0;
task
automatic
reset_dut
;
begin
$
display
(
"*** Toggle reset."
);
rstn_i
<=
1'b0
;
hsel_i
=
0
;
htrans_i
=
2'b00
;
rstn_i
<=
1'b0
;
hsel_i
=
0
;
htrans_i
=
2'b00
;
#
CLK_PERIOD
;
#
CLK_PERIOD
;
rstn_i
<=
1'b1
;
rstn_i
<=
1'b1
;
#
CLK_PERIOD
;
$
display
(
"Done"
);
end
...
...
@@ -113,7 +115,7 @@ task automatic init_sim;
begin
$
display
(
"*** init sim."
);
clk_i
<=
'
{
default
:
1
}
;
rstn_i
<=
'
{
default
:
0
}
;
rstn_i
<=
'
{
default
:
0
}
;
events_i
<=
'
{
default
:
0
}
;
$
display
(
"Done"
);
end
...
...
@@ -130,31 +132,31 @@ task automatic init_sim;
//*** Single word sequential ahb write request
task
automatic
sws_ahb_w
(
input
int
addr
,
data
,
output
int
rval
);
begin
int
rval
;
integer
test_fail
;
localparam
TRANS_SEQUENTIAL
=
2'b11
;
int
rval
;
integer
test_fail
;
localparam
TRANS_SEQUENTIAL
=
2'b11
;
// wait for ready
while
(
!
hreadyo_o
)
begin
#
CLK_PERIOD
;
end
//Once ready is available
hsel_i
=
1
;
hwrite_i
=
1
;
htrans_i
=
TRANS_SEQUENTIAL
;
haddr_i
=
addr
;
hwdata_i
=
data
;
hsel_i
=
1
;
hwrite_i
=
1
;
htrans_i
=
TRANS_SEQUENTIAL
;
haddr_i
=
addr
;
hwdata_i
=
data
;
#
CLK_PERIOD
;
//wait for acknowledge and finish request
while
(
hresp_o
!=
2'b01
)
begin
#
CLK_PERIOD
;
end
hsel_i
=
0
;
hwrite_i
=
0
;
htrans_i
=
TRANS_SEQUENTIAL
;
haddr_i
=
addr
;
hwdata_i
=
32'hc7a9c7a9
;
hsel_i
=
0
;
hwrite_i
=
0
;
htrans_i
=
TRANS_SEQUENTIAL
;
haddr_i
=
addr
;
hwdata_i
=
32'hc7a9c7a9
;
//For now i don't check the results
rval
=
1
;
rval
=
1
;
end
endtask
//Run "a" cycles, random input events
...
...
@@ -162,10 +164,10 @@ task automatic rand_run(input longint a);
begin
integer
i
;
$
display
(
"*** rand srun %0d."
,
a
);
tb_test_name
=
"rand_run"
;
tb_test_name
=
"rand_run"
;
for
(
i
=
0
;
i
<
a
;
i
++
)
begin
#
CLK_PERIOD
;
events_i
<=
$
random
();
events_i
<=
$
random
()
;
end
$
display
(
"Done"
);
end
...
...
@@ -175,29 +177,29 @@ task automatic rand_run(input longint a);
//***task automatic test_sim***
task
automatic
test_sim
;
begin
int
tmp
=
1
;
int
tmp
=
1
;
$
display
(
"*** test_sim"
);
// Simple writes tests
sws_ahb_w
(
32'h8010000
,
32'h2
,
tmp
);
sws_ahb_w
(
32'h8010000
,
32'h1
,
tmp
);
sws_ahb_w
(
32'h8010000
,
32'h2
,
tmp
);
sws_ahb_w
(
32'h8010000
,
32'h1
,
tmp
);
sws_ahb_w
(
32'h801000ac
,
32'hcafecafe
,
tmp
);
sws_ahb_w
(
32'h801000ac
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b0
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b4
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b8
,$
random
(),
tmp
);
rand_run
(
50
);
$
display
(
"Done"
);
sws_ahb_w
(
32'h801000ac
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b0
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b4
,$
random
(),
tmp
);
sws_ahb_w
(
32'h801000b8
,$
random
(),
tmp
);
rand_run
(
50
);
$
display
(
"Done"
);
end
endtask
//***init_sim***
initial
begin
integer
retv
;
init_sim
(
);
init_dump
();
reset_dut
();
test_sim
(
);
$
display
(
"FT = %d"
,
FT
);
init_sim
(
);
init_dump
(
);
reset_dut
(
);
test_sim
(
);
$
display
(
"FT = %d"
,
FT
);
$
finish
;
end
...
...
tb/questa_sim/tb_pmu_raw/tb_PMU_raw.sv
View file @
fe779333
...
...
@@ -26,50 +26,107 @@ module tb_PMU_raw();
parameter
CLK_PERIOD
=
2
;
parameter
CLK_HALF_PERIOD
=
CLK_PERIOD
/
2
;
//***DUT parameters***
parameter
TB_
DATA
_WIDTH
=
32
;
parameter
TB_N_COUNTERS
=
24
;
parameter
TB_N_SOC_EV
=
32
;
parameter
TB_
N_CFG
=
1
;
parameter
TB_N_CO
RES
=
4
;
//WARNIGN: if N_counters or cores change this value needs to change
parameter
TB_
TOTAL_NREGS
=
47
;
parameter
TB_
REG
_WIDTH
=
32
;
parameter
TB_N_COUNTERS
=
24
;
parameter
TB_N_SOC_EV
=
128
;
parameter
TB_
MCCU_N_CORES
=
6
;
parameter
TB_N_CO
NF_REGS
=
1
;
parameter
TB_MCCU_WEIGHTS_WIDTH
=
8
;
parameter
TB_
MCCU_N_EVENTS
=
2
;
parameter
FT
=
0
;
//------------- Internal Parameters
// *** Active functions and global configuration
//---- Overflow
localparam
integer
OVERFLOW
=
1
;
//Yes/No
//---- Quota
localparam
integer
QUOTA
=
1
;
//Yes/No
//---- MCCU - Maximum-contention Control Unit mode
localparam
integer
MCCU
=
1
;
//Yes/No
//---- RDC - Request Duration Counters
localparam
integer
RDC
=
1
;
//Yes/No
//---- Crossbar
localparam
integer
CROSSBAR
=
1
;
//Yes/No
//---- MCCU registers and parameters
// General parameters feature
localparam
BASE_CFG
=
0
;
// Main configuration register for the MCCU
localparam
N_MCCU_CFG
=
1
;
// Quota limit assgined to each core
localparam
N_MCCU_LIMITS
=
TB_MCCU_N_CORES
;
// Currently available Quota for each core
localparam
N_MCCU_QUOTA
=
TB_MCCU_N_CORES
;
// Weights for each one of the available events
localparam
N_MCCU_WEIGHTS
=
(((
TB_MCCU_N_CORES
*
TB_MCCU_N_EVENTS
*
TB_MCCU_WEIGHTS_WIDTH
)
-
1
)
/
TB_REG_WIDTH
+
1
);
//--- MCCU registers
localparam
N_MCCU_REGS
=
(
N_MCCU_CFG
+
N_MCCU_LIMITS
+
N_MCCU_QUOTA
+
N_MCCU_WEIGHTS
)
*
MCCU
;
//---- RDC registers and parameters. Shared with MCCU
// General parameters feature
localparam
N_RDC_WEIGHTS
=
0
;
// Interruption vector
localparam
N_RDC_VECT_REGS
=
((
TB_MCCU_N_CORES
*
TB_MCCU_N_EVENTS
-
1
)
/
TB_REG_WIDTH
+
1
);
// Watermark for each one of the available events
localparam
N_RDC_WATERMARK
=
(((
TB_MCCU_N_CORES
*
TB_MCCU_N_EVENTS
*
TB_MCCU_WEIGHTS_WIDTH
)
-
1
)
/
TB_REG_WIDTH
+
1
);
//--- RDC registers
localparam
N_RDC_REGS
=
(
N_RDC_WEIGHTS
+
N_RDC_VECT_REGS
+
N_RDC_WATERMARK
)
*
RDC
;
//---- OVERFLOW registers
localparam
N_OVERFLOW_REGS
=
2
*
((
TB_N_COUNTERS
-
1
)
/
TB_REG_WIDTH
+
1
)
*
OVERFLOW
;
//---- QUOTA registers
localparam
N_QUOTA_REGS
=
2
*
((
TB_N_COUNTERS
-
1
)
/
TB_REG_WIDTH
+
1
)
*
QUOTA
;
//---- CROSSBAR registers
localparam
N_CROSSBAR_CFG
=
((
TB_N_COUNTERS
*
$
clog2
(
TB_N_SOC_EV
)
-
1
)
/
TB_REG_WIDTH
+
1
)
*
CROSSBAR
;
localparam
N_CROSSBAR_REGS
=
N_CROSSBAR_CFG
;
localparam
CROSSBAR_CFG_BITS
=
$
clog2
(
TB_N_SOC_EV
);
localparam
END_MCCU_WEIGHTS
=
BASE_CFG
+
TB_N_CONF_REGS
+
TB_N_COUNTERS
+
N_OVERFLOW_REGS
+
N_QUOTA_REGS
+
N_MCCU_CFG
+
N_MCCU_LIMITS
+
TB_MCCU_N_CORES
-
1
+
N_MCCU_WEIGHTS
;
localparam
BASE_RDC_VECT
=
END_MCCU_WEIGHTS
+
1
;
localparam
BASE_RDC_WATERMARK
=
BASE_RDC_VECT
+
N_RDC_VECT_REGS
;
localparam
BASE_CROSSBAR
=
BASE_RDC_WATERMARK
+
N_RDC_WATERMARK
;
//---- Total of registers used
localparam
integer
TB_TOTAL_NREGS
=
TB_N_COUNTERS
+
TB_N_CONF_REGS
+
N_MCCU_REGS
+
N_RDC_REGS
+
N_OVERFLOW_REGS
+
N_QUOTA_REGS
+
N_CROSSBAR_REGS
;
//***Signals***
reg
tb_clk_i
;
reg
tb_rstn_i
;
reg
[
TB_N_SOC_EV
-
1
:
0
]
tb_events_i
;
logic
[
TB_
DATA
_WIDTH
-
1
:
0
]
tb_regs_i
[
0
:
TB_TOTAL_NREGS
-
1
];
wire
[
TB_
DATA
_WIDTH
-
1
:
0
]
tb_regs_o
[
0
:
TB_TOTAL_NREGS
-
1
];
reg
tb_wrapper_we_i
;
wire
tb_intr_overflow_o
;
wire
tb_intr_quota_o
;
wire
[
TB_N_CORES
-
1
:
0
]
tb_intr_MCCU_o
;
wire
tb_intr_RDC_o
;
reg
[
TB_N_SOC_EV
-
1
:
0
]
tb_events_i
;
logic
[
TB_
REG
_WIDTH
-
1
:
0
]
tb_regs_i
[
0
:
TB_TOTAL_NREGS
-
1
];
wire
[
TB_
REG
_WIDTH
-
1
:
0
]
tb_regs_o
[
0
:
TB_TOTAL_NREGS
-
1
];
reg
tb_wrapper_we_i
;
wire
tb_intr_overflow_o
;
wire
tb_intr_quota_o
;
wire
[
TB_
MCCU_
N_CORES
-
1
:
0
]
tb_intr_MCCU_o
;
wire
tb_intr_RDC_o
;
//store name of test for easier debug of waveform
reg
[
64
*
8
:
0
]
tb_test_name
;
reg
tb_fail
=
0
;
reg
[
64
*
8
:
0
]
tb_test_name
;
reg
tb_fail
=
0
;
//***Module***
PMU_raw
#(
.
REG_WIDTH
(
TB_DATA_WIDTH
),
.
N_COUNTERS
(
TB_N_COUNTERS
),
.
N_SOC_EV
(
32
),
.
FT
(
FT
),
.
N_CONF_REGS
(
TB_N_CFG
)
.
REG_WIDTH
(
TB_REG_WIDTH
),
.
N_COUNTERS
(
TB_N_COUNTERS
),
.
N_SOC_EV
(
TB_N_SOC_EV
),
.
MCCU_N_CORES
(
TB_MCCU_N_CORES
),
.
N_CONF_REGS
(
TB_N_CONF_REGS
),
.
MCCU_WEIGHTS_WIDTH
(
TB_MCCU_WEIGHTS_WIDTH
),
.
MCCU_N_EVENTS
(
TB_MCCU_N_EVENTS
),
.
FT
(
FT
)
)
dut_PMU_raw
(
.
clk_i
(
tb_clk_i
),
.
rstn_i
(
tb_rstn_i
),
.
regs_i
(
tb_regs_i
),
.
regs_o
(
tb_regs_o
),
.
wrapper_we_i
(
tb_wrapper_we_i
),
.
events_i
(
tb_events_i
),
.
intr_overflow_o
(
tb_intr_overflow_o
),
.
intr_quota_o
(
tb_intr_quota_o
),
.
intr_MCCU_o
(
tb_intr_MCCU_o
),
.
intr_FT1_o
(
),
.
intr_FT2_o
(
),
.
intr_RDC_o
(
tb_intr_RDC_o
)
.
clk_i
(
tb_clk_i
),
.
rstn_i
(
tb_rstn_i
),
.
regs_i
(
tb_regs_i
),
.
regs_o
(
tb_regs_o
),
.
wrapper_we_i
(
tb_wrapper_we_i
),
.
events_i
(
tb_events_i
),
.
intr_overflow_o
(
tb_intr_overflow_o
),
.
intr_quota_o
(
tb_intr_quota_o
),
.
intr_MCCU_o
(
tb_intr_MCCU_o
),
.
intr_FT1_o
(
),
.
intr_FT2_o
(
),
.
intr_RDC_o
(
tb_intr_RDC_o
)
);
//***clk_gen***
...
...
@@ -94,7 +151,7 @@ task automatic init_sim;
begin
$
display
(
"*** init sim."
);
tb_clk_i
<=
'
{
default
:
1
}
;
tb_rstn_i
<=
'
{
default
:
0
}
;
tb_rstn_i
<=
'
{
default
:
0
}
;
tb_events_i
<=
'
{
default
:
0
}
;
tb_regs_i
<=
'
{
default
:
0
}
;
tb_wrapper_we_i
<=
'
{
default
:
0
}
;
...
...
@@ -151,15 +208,9 @@ endtask
// selected output. The function enables the input
// sets the configuration register and checks if
// the signal reaches the output.
//NOT-PARAMETRIC: fails if input parameters change
// Valid for REG_WIDTH=32 N_COUNTERS=24 N_CONF_REGS=1
//All functions enabled (Overflo,Quota,MCCU,RDC,Crossbar), RDC and MCCU parameters equal
// MCCU_WEIGHTS_WIDTH=8 MCCU_N_CORES=4 MCCU_N_EVENTS=2 CROSSBAR_INPUTS=32
localparam
CROSSBAR_CFG_BITS
=
$
clog2
(
TB_N_SOC_EV
);
localparam
BASE_CROSSBAR
=
43
;
localparam
N_CROSSBAR_CFG
=
4
;
logic
[
TB_N_SOC_EV
-
1
:
0
]
unpack_crossbar_cfg
[
0
:
TB_N_COUNTERS
];
logic
[
N_CROSSBAR_CFG
*
TB_
DATA
_WIDTH
-
1
:
0
]
concat_cfg_crossbar
;
logic
[
N_CROSSBAR_CFG
*
TB_
REG
_WIDTH
-
1
:
0
]
concat_cfg_crossbar
;
//Map unpacked configuration registers to concatenation
integer
i
;
always_comb
begin
...
...
@@ -171,16 +222,16 @@ end
integer
j
;
always_comb
begin
for
(
j
=
0
;
j
<
N_CROSSBAR_CFG
;
j
++
)
begin
tb_regs_i
[
BASE_CROSSBAR
+
j
]
=
concat_cfg_crossbar
[
j
*
TB_
DATA
_WIDTH
+:
TB_
DATA
_WIDTH
];
tb_regs_i
[
BASE_CROSSBAR
+
j
]
=
concat_cfg_crossbar
[
j
*
TB_
REG
_WIDTH
+:
TB_
REG
_WIDTH
];
end
end
// Now we can drive unpack_crossbar_cfg with route_ito and get the values in tb_regs_i without
//any conversion
task
automatic
route_ito
(
input
int
in
,
out
,
output
int
tb_fail
);
begin
tb_test_name
=
"route_ito"
;
tb_test_name
=
"route_ito"
;
//set all other signals to 0
tb_events_i
<=
'
{
default
:
0
}
;
tb_events_i
<=
'
{
default
:
0
}
;
//enable signal that we want to route
#
CLK_PERIOD
;
tb_events_i
[
in
]
=
1
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment