-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
i3c_controller_core_ip.tcl
126 lines (106 loc) · 4.11 KB
/
i3c_controller_core_ip.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
###############################################################################
## Copyright (C) 2024 Analog Devices, Inc. All rights reserved.
### SPDX short identifier: ADIBSD
###############################################################################
source ../../../scripts/adi_env.tcl
source $ad_hdl_dir/library/scripts/adi_ip_xilinx.tcl
global VIVADO_IP_LIBRARY
adi_ip_create i3c_controller_core
adi_ip_files i3c_controller_core [list \
"i3c_controller_core.v" \
"i3c_controller_framing.v" \
"i3c_controller_word.v" \
"i3c_controller_word.vh" \
"i3c_controller_bit_mod.v" \
"i3c_controller_bit_mod.vh" \
]
adi_ip_properties_lite i3c_controller_core
set_property company_url {https://wiki.analog.com/resources/fpga/peripherals/i3c_controller/core} [ipx::current_core]
# Remove all inferred interfaces
ipx::remove_all_bus_interface [ipx::current_core]
## Interface definitions
adi_add_bus "i3c" "master" \
"analog.com:interface:i3c_controller_rtl:1.0" \
"analog.com:interface:i3c_controller:1.0" \
{
{"i3c_scl" "scl"} \
{"i3c_sdo" "sdo"} \
{"i3c_sdi" "sdi"} \
{"i3c_t" "t"} \
}
adi_add_bus_clock "clk" "i3c" "reset_n"
adi_add_bus "sdio" "slave" \
"analog.com:interface:i3c_controller_sdio_rtl:1.0" \
"analog.com:interface:i3c_controller_sdio:1.0" \
{
{"sdo_ready" "sdo_ready"} \
{"sdo_valid" "sdo_valid"} \
{"sdo" "sdo"} \
{"sdi_ready" "sdi_ready"} \
{"sdi_valid" "sdi_valid"} \
{"sdi_last" "sdi_last"} \
{"sdi" "sdi"} \
{"ibi_ready" "ibi_ready"} \
{"ibi_valid" "ibi_valid"} \
{"ibi" "ibi"} \
}
adi_add_bus_clock "clk" "sdio" "reset_n"
adi_add_bus "cmdp" "slave" \
"analog.com:interface:i3c_controller_cmdp_rtl:1.0" \
"analog.com:interface:i3c_controller_cmdp:1.0" \
{
{"cmdp_valid" "cmdp_valid"} \
{"cmdp_ready" "cmdp_ready"} \
{"cmdp" "cmdp"} \
{"cmdp_error" "cmdp_error"} \
{"cmdp_nop" "cmdp_nop"} \
{"cmdp_daa_trigger" "cmdp_daa_trigger"} \
}
adi_add_bus_clock "clk" "cmdp" "reset_n"
adi_add_bus "rmap" "slave" \
"analog.com:interface:i3c_controller_rmap_rtl:1.0" \
"analog.com:interface:i3c_controller_rmap:1.0" \
{
{"rmap_ibi_config" "rmap_ibi_config"} \
{"rmap_pp_sg" "rmap_pp_sg"} \
{"rmap_dev_char_addr" "rmap_dev_char_addr"} \
{"rmap_dev_char_data" "rmap_dev_char_data"} \
}
adi_add_bus_clock "clk" "rmap" "reset_n" "master"
set cc [ipx::current_core]
## MAX_DEVS
set_property -dict [list \
"value_validation_type" "range_long" \
"value_validation_range_minimum" "1" \
"value_validation_range_maximum" "16" \
] \
[ipx::get_user_parameters MAX_DEVS -of_objects $cc]
## CLK_MOD
set_property -dict [list \
"value_validation_type" "pairs" \
"value_validation_pairs" {"8" 0 "4" 1} \
] \
[ipx::get_user_parameters CLK_MOD -of_objects $cc]
## Customize IP Layout
## Remove the automatically generated GUI page
ipgui::remove_page -component $cc [ipgui::get_pagespec -name "Page 0" -component $cc]
ipx::save_core [ipx::current_core]
## Create general configuration page
ipgui::add_page -name {I3C Controller Core} -component [ipx::current_core] -display_name {AXI I3C Controller Core}
set page0 [ipgui::get_pagespec -name "I3C Controller Core" -component $cc]
set general_group [ipgui::add_group -name "General Configuration" -component $cc \
-parent $page0 -display_name "General Configuration" ]
ipgui::add_param -name "MAX_DEVS" -component $cc -parent $general_group
set_property -dict [list \
"display_name" "Maximum number of peripherals" \
"tooltip" "\[MAX_DEVS\] Maximum number of peripherals in the bus, counting the controller" \
] [ipgui::get_guiparamspec -name "MAX_DEVS" -component $cc]
ipgui::add_param -name "CLK_MOD" -component $cc -parent $general_group
set_property -dict [list \
"widget" "comboBox" \
"display_name" "Clock cycles per bit" \
"tooltip" "\[CLK_MOD\] Adjust clock cycles required to modulate the lane bus bits. Set 8 to achieve 12.5MHz at 100Mhz input clock, and 4 at 50MHz." \
] [ipgui::get_guiparamspec -name "CLK_MOD" -component $cc]
## Create and save the XGUI file
ipx::create_xgui_files $cc
ipx::save_core $cc