diff --git a/Bender.yml b/Bender.yml index de23acc..b3bc15e 100644 --- a/Bender.yml +++ b/Bender.yml @@ -41,6 +41,7 @@ sources: files: - src/hyperbus_delay.sv + - src/regs/hyperbus_cfg_regblock_pkg.sv - src/hyperbus_pkg.sv - src/hyperbus_clk_gen.sv - src/hyperbus_clock_diff_out.sv @@ -48,6 +49,7 @@ sources: - src/hyperbus_phy2r.sv - src/hyperbus_ddr_out.sv - src/hyperbus_trx.sv + - src/regs/hyperbus_cfg_regblock.sv - src/hyperbus_cfg_regs.sv - src/hyperbus_phy.sv - src/hyperbus_phy_if.sv @@ -63,4 +65,5 @@ sources: - test/dut_if.sv - test/hyperbus_tb_pkg.sv - test/axi_hyper_tb.sv + - test/hyperbus_cfg_regs_tb.sv - src/hyperbus.sv diff --git a/Makefile b/Makefile index 93b6d6f..e94ebbd 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,9 @@ all: build run clean: sim_clean +update-regs: + bash scripts/gen_regs.sh + # Ensure half-built targets are purged .DELETE_ON_ERROR: diff --git a/docs/regs/hyperbus_cfg_regs.md b/docs/regs/hyperbus_cfg_regs.md new file mode 100644 index 0000000..9458acf --- /dev/null +++ b/docs/regs/hyperbus_cfg_regs.md @@ -0,0 +1,1135 @@ + + +## hyperbus_cfg_regs address map + +- Absolute Address: 0x0 +- Base Offset: 0x0 +- Size: 0x1000 + +

HyperBus controller configuration register map. Enabled chip ranges must be 4 MiB aligned, ordered by chip-select index, and non-overlapping.

+ +|Offset| Identifier |Name| +|------|------------|----| +| 0x000| global_cfg | — | +| 0x100| frontend | — | +| 0x200| backend | — | +| 0x300| phy_0 | — | +| 0x340| phy_1 | — | +| 0x400| chip_0 | — | +| 0x440| chip_1 | — | +| 0x480| chip_2 | — | +| 0x4C0| chip_3 | — | +| 0x500| chip_4 | — | +| 0x540| chip_5 | — | +| 0x580| chip_6 | — | +| 0x5C0| chip_7 | — | +| 0xFFC|reserved_top| — | + +## global_cfg register file + +- Absolute Address: 0x0 +- Base Offset: 0x0 +- Size: 0x14 + +|Offset| Identifier |Name| +|------|--------------|----| +| 0x00 | ip_version | — | +| 0x04 |reg_if_version| — | +| 0x08 | capability | — | +| 0x0C | command | — | +| 0x10 | status | — | + +### ip_version register + +- Absolute Address: 0x0 +- Base Offset: 0x0 +- Size: 0x4 + +

IP version (major.minor.patch.revision).

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +| 7:0 | revision | r | 0x0 | — | +| 15:8| patch | r | 0x9 | — | +|23:16| minor | r | 0x0 | — | +|31:24| major | r | 0x0 | — | + +### reg_if_version register + +- Absolute Address: 0x4 +- Base Offset: 0x4 +- Size: 0x4 + +

Register interface version.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +| 15:0| minor | r | 0x0 | — | +|31:16| major | r | 0x1 | — | + +### capability register + +- Absolute Address: 0x8 +- Base Offset: 0x8 +- Size: 0x4 + +

Hardware-provided implementation capabilities.

+ +|Bits| Identifier |Access|Reset|Name| +|----|------------------|------|-----|----| +| 7:0| num_chips | r | 0x0 | — | +|15:8| num_phys | r | 0x0 | — | +| 16 | per_chip_cfg | r | 0x0 | — | +| 17 | per_phy_cfg | r | 0x0 | — | +| 18 | chip_enable | r | 0x0 | — | +| 19 | clock_divider | r | 0x0 | — | +| 20 | staged_apply | r | 0x0 | — | +| 21 | error_status | r | 0x0 | — | +| 22 |rwds_sample_timing| r | 0x0 | — | +| 23 | rwds_oe_timing | r | 0x0 | — | + +#### num_chips field + +

Number of implemented chip selects.

+ +#### num_phys field + +

Number of implemented PHY lanes.

+ +#### per_chip_cfg field + +

Each chip record controls its corresponding chip rather than chip 0 being shared.

+ +#### per_phy_cfg field + +

Each PHY record controls its corresponding lane rather than PHY 0 being shared.

+ +#### chip_enable field + +

Per-chip enable bits participate in address decoding.

+ +#### clock_divider field + +

CLOCK_CFG controls an implemented backend clock divider.

+ +#### staged_apply field + +

FLUSH and APPLY commands implement a staged configuration barrier.

+ +#### error_status field + +

STATUS reports sticky controller errors.

+ +#### rwds_sample_timing field + +

Per-chip RWDS sample timing is implemented.

+ +#### rwds_oe_timing field + +

Per-PHY RWDS output-enable timing is implemented.

+ +### command register + +- Absolute Address: 0xC +- Base Offset: 0xC +- Size: 0x4 + +

Single-cycle write-one command strobes, active when capability.staged_apply is set; otherwise writes are retained only as inert pulses.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 0 | flush | rw | 0x0 | — | +| 1 | apply | rw | 0x0 | — | + +### status register + +- Absolute Address: 0x10 +- Base Offset: 0x10 +- Size: 0x4 + +

Controller status.

+ +|Bits| Identifier | Access |Reset|Name| +|----|------------|---------|-----|----| +| 0 |decode_error|rw, woclr| 0x0 | — | +| 1 | busy | r | 0x0 | — | +| 2 | dirty | r | 0x0 | — | + +## frontend register file + +- Absolute Address: 0x100 +- Base Offset: 0x100 +- Size: 0x4 + +|Offset| Identifier |Name| +|------|------------|----| +| 0x0 |frontend_cfg| — | + +### frontend_cfg register + +- Absolute Address: 0x100 +- Base Offset: 0x0 +- Size: 0x4 + +

Frontend configuration. dual_phy must be 0 or 1.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 0 | dual_phy | rw | 0x1 | — | + +## backend register file + +- Absolute Address: 0x200 +- Base Offset: 0x200 +- Size: 0x4 + +|Offset|Identifier|Name| +|------|----------|----| +| 0x0 | clock_cfg| — | + +### clock_cfg register + +- Absolute Address: 0x200 +- Base Offset: 0x0 +- Size: 0x4 + +

Backend clock-divider configuration, active when capability.clock_divider is set; divider values must be at least 2.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| divider | rw | 0x8 | — | + +## phy_0 register file + +- Absolute Address: 0x300 +- Base Offset: 0x300 +- Size: 0x8 + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x0 | tx_delay | — | +| 0x4 |rwds_timing| — | + +### tx_delay register + +- Absolute Address: 0x300 +- Base Offset: 0x0 +- Size: 0x4 + +

PHY transmit delay. PHY 0 is shared when capability.per_phy_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +### rwds_timing register + +- Absolute Address: 0x304 +- Base Offset: 0x4 +- Size: 0x4 + +

PHY RWDS output-enable timing. rwds_oe_setup_cycles must be at most 15 and is active when capability.rwds_oe_timing is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|--------------------|------|-----|----| +| 7:0|rwds_oe_setup_cycles| rw | 0x1 | — | + +## phy_1 register file + +- Absolute Address: 0x340 +- Base Offset: 0x340 +- Size: 0x8 + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x0 | tx_delay | — | +| 0x4 |rwds_timing| — | + +### tx_delay register + +- Absolute Address: 0x340 +- Base Offset: 0x0 +- Size: 0x4 + +

PHY transmit delay. PHY 0 is shared when capability.per_phy_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +### rwds_timing register + +- Absolute Address: 0x344 +- Base Offset: 0x4 +- Size: 0x4 + +

PHY RWDS output-enable timing. rwds_oe_setup_cycles must be at most 15 and is active when capability.rwds_oe_timing is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|--------------------|------|-----|----| +| 7:0|rwds_oe_setup_cycles| rw | 0x1 | — | + +## chip_0 register file + +- Absolute Address: 0x400 +- Base Offset: 0x400 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x400 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x0 | — | + +### range_bound register + +- Absolute Address: 0x404 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x1 | — | + +### address_cfg register + +- Absolute Address: 0x408 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x40C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x410 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x414 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x418 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_1 register file + +- Absolute Address: 0x440 +- Base Offset: 0x440 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x440 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x1 | — | + +### range_bound register + +- Absolute Address: 0x444 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x2 | — | + +### address_cfg register + +- Absolute Address: 0x448 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x44C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x450 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x454 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x458 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_2 register file + +- Absolute Address: 0x480 +- Base Offset: 0x480 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x480 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x2 | — | + +### range_bound register + +- Absolute Address: 0x484 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x3 | — | + +### address_cfg register + +- Absolute Address: 0x488 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x48C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x490 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x494 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x498 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_3 register file + +- Absolute Address: 0x4C0 +- Base Offset: 0x4C0 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x4C0 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x3 | — | + +### range_bound register + +- Absolute Address: 0x4C4 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x4 | — | + +### address_cfg register + +- Absolute Address: 0x4C8 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x4CC +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x4D0 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x4D4 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x4D8 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_4 register file + +- Absolute Address: 0x500 +- Base Offset: 0x500 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x500 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x4 | — | + +### range_bound register + +- Absolute Address: 0x504 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x5 | — | + +### address_cfg register + +- Absolute Address: 0x508 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x50C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x510 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x514 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x518 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_5 register file + +- Absolute Address: 0x540 +- Base Offset: 0x540 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x540 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x5 | — | + +### range_bound register + +- Absolute Address: 0x544 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x6 | — | + +### address_cfg register + +- Absolute Address: 0x548 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x54C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x550 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x554 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x558 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_6 register file + +- Absolute Address: 0x580 +- Base Offset: 0x580 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x580 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x6 | — | + +### range_bound register + +- Absolute Address: 0x584 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x7 | — | + +### address_cfg register + +- Absolute Address: 0x588 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x58C +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x590 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x594 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x598 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +## chip_7 register file + +- Absolute Address: 0x5C0 +- Base Offset: 0x5C0 +- Size: 0x1C + +|Offset| Identifier|Name| +|------|-----------|----| +| 0x00 | range_base| — | +| 0x04 |range_bound| — | +| 0x08 |address_cfg| — | +| 0x0C |latency_cfg| — | +| 0x10 | burst_cfg | — | +| 0x14 |chip_timing| — | +| 0x18 | rx_delay | — | + +### range_base register + +- Absolute Address: 0x5C0 +- Base Offset: 0x0 +- Size: 0x4 + +

Inclusive 4 MiB-aligned chip address range base.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x7 | — | + +### range_bound register + +- Absolute Address: 0x5C4 +- Base Offset: 0x4 +- Size: 0x4 + +

Exclusive 4 MiB-aligned chip address range bound.

+ +| Bits|Identifier|Access|Reset|Name| +|-----|----------|------|-----|----| +|31:22| value | rw | 0x8 | — | + +### address_cfg register + +- Absolute Address: 0x5C8 +- Base Offset: 0x8 +- Size: 0x4 + +

Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set.

+ +|Bits| Identifier |Access|Reset|Name| +|----|----------------|------|-----|----| +| 7:0| address_space | rw | 0x0 | — | +|15:8|address_mask_msb| rw | 0x19| — | +| 16 | enable | rw | 0x1 | — | + +### latency_cfg register + +- Absolute Address: 0x5CC +- Base Offset: 0xC +- Size: 0x4 + +

Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier |Access|Reset|Name| +|----|---------------------|------|-----|----| +| 7:0| t_latency_access | rw | 0x6 | — | +|15:8| rwds_sample_delay | rw | 0x0 | — | +| 16 |en_latency_additional| rw | 0x0 | — | + +### burst_cfg register + +- Absolute Address: 0x5D0 +- Base Offset: 0x10 +- Size: 0x4 + +

Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits| Identifier|Access|Reset|Name| +|----|-----------|------|-----|----| +|15:0|t_burst_max| rw |0x15E| — | + +### chip_timing register + +- Absolute Address: 0x5D4 +- Base Offset: 0x14 +- Size: 0x4 + +

Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +| Bits| Identifier |Access|Reset|Name| +|-----|---------------------|------|-----|----| +| 7:0 |t_read_write_recovery| rw | 0x6 | — | +| 15:8| t_csh_cycles | rw | 0x1 | — | +|23:16| csn_to_ck_cycles | rw | 0x0 | — | + +### rx_delay register + +- Absolute Address: 0x5D8 +- Base Offset: 0x18 +- Size: 0x4 + +

Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +| 7:0| value | rw | 0x10| — | + +### reserved_top register + +- Absolute Address: 0xFFC +- Base Offset: 0xFFC +- Size: 0x4 + +

Reserved endpoint that fixes the register window size to 4 KiB.

+ +|Bits|Identifier|Access|Reset|Name| +|----|----------|------|-----|----| +|31:0| value | r | 0x0 | — | diff --git a/include/hyperbus_cfg_regs.h b/include/hyperbus_cfg_regs.h new file mode 100644 index 0000000..25b7b58 --- /dev/null +++ b/include/hyperbus_cfg_regs.h @@ -0,0 +1,438 @@ +// Generated by PeakRDL-cheader - A free and open-source header generator +// https://github.com/SystemRDL/PeakRDL-cheader + +#ifndef HYPERBUS_CFG_REGS_H +#define HYPERBUS_CFG_REGS_H + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include + +// reg - hyperbus_cfg_regs::ip_version +#define HYPERBUS_CFG_REGS__IP_VERSION__REVISION_bm 0xff +#define HYPERBUS_CFG_REGS__IP_VERSION__REVISION_bp 0 +#define HYPERBUS_CFG_REGS__IP_VERSION__REVISION_bw 8 +#define HYPERBUS_CFG_REGS__IP_VERSION__REVISION_reset 0x0 +#define HYPERBUS_CFG_REGS__IP_VERSION__PATCH_bm 0xff00 +#define HYPERBUS_CFG_REGS__IP_VERSION__PATCH_bp 8 +#define HYPERBUS_CFG_REGS__IP_VERSION__PATCH_bw 8 +#define HYPERBUS_CFG_REGS__IP_VERSION__PATCH_reset 0x9 +#define HYPERBUS_CFG_REGS__IP_VERSION__MINOR_bm 0xff0000 +#define HYPERBUS_CFG_REGS__IP_VERSION__MINOR_bp 16 +#define HYPERBUS_CFG_REGS__IP_VERSION__MINOR_bw 8 +#define HYPERBUS_CFG_REGS__IP_VERSION__MINOR_reset 0x0 +#define HYPERBUS_CFG_REGS__IP_VERSION__MAJOR_bm 0xff000000 +#define HYPERBUS_CFG_REGS__IP_VERSION__MAJOR_bp 24 +#define HYPERBUS_CFG_REGS__IP_VERSION__MAJOR_bw 8 +#define HYPERBUS_CFG_REGS__IP_VERSION__MAJOR_reset 0x0 + +// reg - hyperbus_cfg_regs::reg_if_version +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MINOR_bm 0xffff +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MINOR_bp 0 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MINOR_bw 16 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MINOR_reset 0x0 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MAJOR_bm 0xffff0000 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MAJOR_bp 16 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MAJOR_bw 16 +#define HYPERBUS_CFG_REGS__REG_IF_VERSION__MAJOR_reset 0x1 + +// reg - hyperbus_cfg_regs::capability +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_CHIPS_bm 0xff +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_CHIPS_bp 0 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_CHIPS_bw 8 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_CHIPS_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_PHYS_bm 0xff00 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_PHYS_bp 8 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_PHYS_bw 8 +#define HYPERBUS_CFG_REGS__CAPABILITY__NUM_PHYS_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_CHIP_CFG_bm 0x10000 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_CHIP_CFG_bp 16 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_CHIP_CFG_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_CHIP_CFG_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_PHY_CFG_bm 0x20000 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_PHY_CFG_bp 17 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_PHY_CFG_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__PER_PHY_CFG_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__CHIP_ENABLE_bm 0x40000 +#define HYPERBUS_CFG_REGS__CAPABILITY__CHIP_ENABLE_bp 18 +#define HYPERBUS_CFG_REGS__CAPABILITY__CHIP_ENABLE_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__CHIP_ENABLE_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__CLOCK_DIVIDER_bm 0x80000 +#define HYPERBUS_CFG_REGS__CAPABILITY__CLOCK_DIVIDER_bp 19 +#define HYPERBUS_CFG_REGS__CAPABILITY__CLOCK_DIVIDER_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__CLOCK_DIVIDER_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__STAGED_APPLY_bm 0x100000 +#define HYPERBUS_CFG_REGS__CAPABILITY__STAGED_APPLY_bp 20 +#define HYPERBUS_CFG_REGS__CAPABILITY__STAGED_APPLY_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__STAGED_APPLY_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__ERROR_STATUS_bm 0x200000 +#define HYPERBUS_CFG_REGS__CAPABILITY__ERROR_STATUS_bp 21 +#define HYPERBUS_CFG_REGS__CAPABILITY__ERROR_STATUS_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__ERROR_STATUS_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_SAMPLE_TIMING_bm 0x400000 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_SAMPLE_TIMING_bp 22 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_SAMPLE_TIMING_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_SAMPLE_TIMING_reset 0x0 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_OE_TIMING_bm 0x800000 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_OE_TIMING_bp 23 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_OE_TIMING_bw 1 +#define HYPERBUS_CFG_REGS__CAPABILITY__RWDS_OE_TIMING_reset 0x0 + +// reg - hyperbus_cfg_regs::command +#define HYPERBUS_CFG_REGS__COMMAND__FLUSH_bm 0x1 +#define HYPERBUS_CFG_REGS__COMMAND__FLUSH_bp 0 +#define HYPERBUS_CFG_REGS__COMMAND__FLUSH_bw 1 +#define HYPERBUS_CFG_REGS__COMMAND__FLUSH_reset 0x0 +#define HYPERBUS_CFG_REGS__COMMAND__APPLY_bm 0x2 +#define HYPERBUS_CFG_REGS__COMMAND__APPLY_bp 1 +#define HYPERBUS_CFG_REGS__COMMAND__APPLY_bw 1 +#define HYPERBUS_CFG_REGS__COMMAND__APPLY_reset 0x0 + +// reg - hyperbus_cfg_regs::status +#define HYPERBUS_CFG_REGS__STATUS__DECODE_ERROR_bm 0x1 +#define HYPERBUS_CFG_REGS__STATUS__DECODE_ERROR_bp 0 +#define HYPERBUS_CFG_REGS__STATUS__DECODE_ERROR_bw 1 +#define HYPERBUS_CFG_REGS__STATUS__DECODE_ERROR_reset 0x0 +#define HYPERBUS_CFG_REGS__STATUS__BUSY_bm 0x2 +#define HYPERBUS_CFG_REGS__STATUS__BUSY_bp 1 +#define HYPERBUS_CFG_REGS__STATUS__BUSY_bw 1 +#define HYPERBUS_CFG_REGS__STATUS__BUSY_reset 0x0 +#define HYPERBUS_CFG_REGS__STATUS__DIRTY_bm 0x4 +#define HYPERBUS_CFG_REGS__STATUS__DIRTY_bp 2 +#define HYPERBUS_CFG_REGS__STATUS__DIRTY_bw 1 +#define HYPERBUS_CFG_REGS__STATUS__DIRTY_reset 0x0 + +// regfile - hyperbus_cfg_regs::global_regs +typedef struct __attribute__ ((__packed__)) { + uint32_t ip_version; + uint32_t reg_if_version; + uint32_t capability; + uint32_t command; + uint32_t status; +} hyperbus_cfg_regs__global_regs_t; + +// reg - hyperbus_cfg_regs::frontend_cfg +#define HYPERBUS_CFG_REGS__FRONTEND_CFG__DUAL_PHY_bm 0x1 +#define HYPERBUS_CFG_REGS__FRONTEND_CFG__DUAL_PHY_bp 0 +#define HYPERBUS_CFG_REGS__FRONTEND_CFG__DUAL_PHY_bw 1 +#define HYPERBUS_CFG_REGS__FRONTEND_CFG__DUAL_PHY_reset 0x1 + +// regfile - hyperbus_cfg_regs::frontend_regs +typedef struct __attribute__ ((__packed__)) { + uint32_t frontend_cfg; +} hyperbus_cfg_regs__frontend_regs_t; + +// reg - hyperbus_cfg_regs::clock_cfg +#define HYPERBUS_CFG_REGS__CLOCK_CFG__DIVIDER_bm 0xff +#define HYPERBUS_CFG_REGS__CLOCK_CFG__DIVIDER_bp 0 +#define HYPERBUS_CFG_REGS__CLOCK_CFG__DIVIDER_bw 8 +#define HYPERBUS_CFG_REGS__CLOCK_CFG__DIVIDER_reset 0x8 + +// regfile - hyperbus_cfg_regs::backend_regs +typedef struct __attribute__ ((__packed__)) { + uint32_t clock_cfg; +} hyperbus_cfg_regs__backend_regs_t; + +// reg - hyperbus_cfg_regs::tx_delay +#define HYPERBUS_CFG_REGS__TX_DELAY__VALUE_bm 0xff +#define HYPERBUS_CFG_REGS__TX_DELAY__VALUE_bp 0 +#define HYPERBUS_CFG_REGS__TX_DELAY__VALUE_bw 8 +#define HYPERBUS_CFG_REGS__TX_DELAY__VALUE_reset 0x10 + +// reg - hyperbus_cfg_regs::rwds_timing +#define HYPERBUS_CFG_REGS__RWDS_TIMING__RWDS_OE_SETUP_CYCLES_bm 0xff +#define HYPERBUS_CFG_REGS__RWDS_TIMING__RWDS_OE_SETUP_CYCLES_bp 0 +#define HYPERBUS_CFG_REGS__RWDS_TIMING__RWDS_OE_SETUP_CYCLES_bw 8 +#define HYPERBUS_CFG_REGS__RWDS_TIMING__RWDS_OE_SETUP_CYCLES_reset 0x1 + +// regfile - hyperbus_cfg_regs::phy_regs +typedef struct __attribute__ ((__packed__)) { + uint32_t tx_delay; + uint32_t rwds_timing; +} hyperbus_cfg_regs__phy_regs_t; + +// reg - hyperbus_cfg_regs::range_base +#define HYPERBUS_CFG_REGS__RANGE_BASE__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE__VALUE_reset 0x0 + +// reg - hyperbus_cfg_regs::range_bound +#define HYPERBUS_CFG_REGS__RANGE_BOUND__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND__VALUE_reset 0x1 + +// reg - hyperbus_cfg_regs::address_cfg +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_SPACE_bm 0xff +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_SPACE_bp 0 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_SPACE_bw 8 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_SPACE_reset 0x0 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_MASK_MSB_bm 0xff00 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_MASK_MSB_bp 8 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_MASK_MSB_bw 8 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ADDRESS_MASK_MSB_reset 0x19 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ENABLE_bm 0x10000 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ENABLE_bp 16 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ENABLE_bw 1 +#define HYPERBUS_CFG_REGS__ADDRESS_CFG__ENABLE_reset 0x1 + +// reg - hyperbus_cfg_regs::latency_cfg +#define HYPERBUS_CFG_REGS__LATENCY_CFG__T_LATENCY_ACCESS_bm 0xff +#define HYPERBUS_CFG_REGS__LATENCY_CFG__T_LATENCY_ACCESS_bp 0 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__T_LATENCY_ACCESS_bw 8 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__T_LATENCY_ACCESS_reset 0x6 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__RWDS_SAMPLE_DELAY_bm 0xff00 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__RWDS_SAMPLE_DELAY_bp 8 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__RWDS_SAMPLE_DELAY_bw 8 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__RWDS_SAMPLE_DELAY_reset 0x0 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__EN_LATENCY_ADDITIONAL_bm 0x10000 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__EN_LATENCY_ADDITIONAL_bp 16 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__EN_LATENCY_ADDITIONAL_bw 1 +#define HYPERBUS_CFG_REGS__LATENCY_CFG__EN_LATENCY_ADDITIONAL_reset 0x0 + +// reg - hyperbus_cfg_regs::burst_cfg +#define HYPERBUS_CFG_REGS__BURST_CFG__T_BURST_MAX_bm 0xffff +#define HYPERBUS_CFG_REGS__BURST_CFG__T_BURST_MAX_bp 0 +#define HYPERBUS_CFG_REGS__BURST_CFG__T_BURST_MAX_bw 16 +#define HYPERBUS_CFG_REGS__BURST_CFG__T_BURST_MAX_reset 0x15e + +// reg - hyperbus_cfg_regs::chip_timing +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_READ_WRITE_RECOVERY_bm 0xff +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_READ_WRITE_RECOVERY_bp 0 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_READ_WRITE_RECOVERY_bw 8 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_READ_WRITE_RECOVERY_reset 0x6 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_CSH_CYCLES_bm 0xff00 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_CSH_CYCLES_bp 8 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_CSH_CYCLES_bw 8 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__T_CSH_CYCLES_reset 0x1 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__CSN_TO_CK_CYCLES_bm 0xff0000 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__CSN_TO_CK_CYCLES_bp 16 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__CSN_TO_CK_CYCLES_bw 8 +#define HYPERBUS_CFG_REGS__CHIP_TIMING__CSN_TO_CK_CYCLES_reset 0x0 + +// reg - hyperbus_cfg_regs::rx_delay +#define HYPERBUS_CFG_REGS__RX_DELAY__VALUE_bm 0xff +#define HYPERBUS_CFG_REGS__RX_DELAY__VALUE_bp 0 +#define HYPERBUS_CFG_REGS__RX_DELAY__VALUE_bw 8 +#define HYPERBUS_CFG_REGS__RX_DELAY__VALUE_reset 0x10 + +// regfile - hyperbus_cfg_regs::chip_regs +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_t; + +// reg - hyperbus_cfg_regs::range_base_value_aea1d0e1 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_AEA1D0E1__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_AEA1D0E1__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_AEA1D0E1__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_AEA1D0E1__VALUE_reset 0x1 + +// reg - hyperbus_cfg_regs::range_bound_value_e30f0c3f +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_E30F0C3F__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_E30F0C3F__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_E30F0C3F__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_E30F0C3F__VALUE_reset 0x2 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_de2a4636_range_bound_d40fd139 +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_de2a4636_range_bound_d40fd139_t; + +// reg - hyperbus_cfg_regs::range_base_value_e30f0c3f +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_E30F0C3F__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_E30F0C3F__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_E30F0C3F__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_E30F0C3F__VALUE_reset 0x2 + +// reg - hyperbus_cfg_regs::range_bound_value_2f629ec9 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_2F629EC9__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_2F629EC9__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_2F629EC9__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_2F629EC9__VALUE_reset 0x3 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_b054dd4c_range_bound_a4d5f83b +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_b054dd4c_range_bound_a4d5f83b_t; + +// reg - hyperbus_cfg_regs::range_base_value_2f629ec9 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_2F629EC9__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_2F629EC9__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_2F629EC9__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_2F629EC9__VALUE_reset 0x3 + +// reg - hyperbus_cfg_regs::range_bound_value_a1e733c2 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_A1E733C2__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_A1E733C2__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_A1E733C2__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_A1E733C2__VALUE_reset 0x4 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_f7266ded_range_bound_5bf260e9 +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_f7266ded_range_bound_5bf260e9_t; + +// reg - hyperbus_cfg_regs::range_base_value_a1e733c2 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_A1E733C2__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_A1E733C2__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_A1E733C2__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_A1E733C2__VALUE_reset 0x4 + +// reg - hyperbus_cfg_regs::range_bound_value_342915db +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_342915DB__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_342915DB__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_342915DB__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_342915DB__VALUE_reset 0x5 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_0d543b99_range_bound_1fffc3a2 +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_0d543b99_range_bound_1fffc3a2_t; + +// reg - hyperbus_cfg_regs::range_base_value_342915db +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_342915DB__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_342915DB__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_342915DB__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_342915DB__VALUE_reset 0x5 + +// reg - hyperbus_cfg_regs::range_bound_value_883c384f +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_883C384F__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_883C384F__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_883C384F__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_883C384F__VALUE_reset 0x6 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_e068ab2e_range_bound_9afa5911 +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_e068ab2e_range_bound_9afa5911_t; + +// reg - hyperbus_cfg_regs::range_base_value_883c384f +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_883C384F__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_883C384F__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_883C384F__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_883C384F__VALUE_reset 0x6 + +// reg - hyperbus_cfg_regs::range_bound_value_d0d03147 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_D0D03147__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_D0D03147__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_D0D03147__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_D0D03147__VALUE_reset 0x7 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_ac4fb754_range_bound_24b9644b +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_ac4fb754_range_bound_24b9644b_t; + +// reg - hyperbus_cfg_regs::range_base_value_d0d03147 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_D0D03147__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_D0D03147__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_D0D03147__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BASE_VALUE_D0D03147__VALUE_reset 0x7 + +// reg - hyperbus_cfg_regs::range_bound_value_971bab53 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_971BAB53__VALUE_bm 0xffc00000 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_971BAB53__VALUE_bp 22 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_971BAB53__VALUE_bw 10 +#define HYPERBUS_CFG_REGS__RANGE_BOUND_VALUE_971BAB53__VALUE_reset 0x8 + +// regfile - hyperbus_cfg_regs::chip_regs_range_base_63c2ba90_range_bound_602aea67 +typedef struct __attribute__ ((__packed__)) { + uint32_t range_base; + uint32_t range_bound; + uint32_t address_cfg; + uint32_t latency_cfg; + uint32_t burst_cfg; + uint32_t chip_timing; + uint32_t rx_delay; +} hyperbus_cfg_regs__chip_regs_range_base_63c2ba90_range_bound_602aea67_t; + +// reg - hyperbus_cfg_regs::reserved_top +#define HYPERBUS_CFG_REGS__RESERVED_TOP__VALUE_bm 0xffffffff +#define HYPERBUS_CFG_REGS__RESERVED_TOP__VALUE_bp 0 +#define HYPERBUS_CFG_REGS__RESERVED_TOP__VALUE_bw 32 +#define HYPERBUS_CFG_REGS__RESERVED_TOP__VALUE_reset 0x0 + +// addrmap - hyperbus_cfg_regs +typedef struct __attribute__ ((__packed__)) { + hyperbus_cfg_regs__global_regs_t global_cfg; + uint8_t RESERVED_14_ff[0xec]; + hyperbus_cfg_regs__frontend_regs_t frontend; + uint8_t RESERVED_104_1ff[0xfc]; + hyperbus_cfg_regs__backend_regs_t backend; + uint8_t RESERVED_204_2ff[0xfc]; + hyperbus_cfg_regs__phy_regs_t phy_0; + uint8_t RESERVED_308_33f[0x38]; + hyperbus_cfg_regs__phy_regs_t phy_1; + uint8_t RESERVED_348_3ff[0xb8]; + hyperbus_cfg_regs__chip_regs_t chip_0; + uint8_t RESERVED_41c_43f[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_de2a4636_range_bound_d40fd139_t chip_1; + uint8_t RESERVED_45c_47f[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_b054dd4c_range_bound_a4d5f83b_t chip_2; + uint8_t RESERVED_49c_4bf[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_f7266ded_range_bound_5bf260e9_t chip_3; + uint8_t RESERVED_4dc_4ff[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_0d543b99_range_bound_1fffc3a2_t chip_4; + uint8_t RESERVED_51c_53f[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_e068ab2e_range_bound_9afa5911_t chip_5; + uint8_t RESERVED_55c_57f[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_ac4fb754_range_bound_24b9644b_t chip_6; + uint8_t RESERVED_59c_5bf[0x24]; + hyperbus_cfg_regs__chip_regs_range_base_63c2ba90_range_bound_602aea67_t chip_7; + uint8_t RESERVED_5dc_ffb[0xa20]; + uint32_t reserved_top; +} hyperbus_cfg_regs_t; + + +static_assert(sizeof(hyperbus_cfg_regs_t) == 0x1000, "Packing error"); + +#ifdef __cplusplus +} +#endif + +#endif /* HYPERBUS_CFG_REGS_H */ diff --git a/scripts/gen_regs.sh b/scripts/gen_regs.sh new file mode 100755 index 0000000..8ceb003 --- /dev/null +++ b/scripts/gen_regs.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Copyright 2026 ETH Zurich and University of Bologna. +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +UV_CACHE_DIR="${UV_CACHE_DIR:-/tmp/uv-cache}" +UV_TOOL_DIR="${UV_TOOL_DIR:-/tmp/uv-tools}" +export UV_CACHE_DIR +export UV_TOOL_DIR + +RDL="${ROOT}/src/regs/hyperbus_cfg_regs.rdl" +PEAKRDL_ARGS=( + --from "peakrdl-cli==1.5.0" + --with "peakrdl-regblock==1.3.1" + --with "peakrdl-cheader==1.1.0" + --with "peakrdl-markdown==1.0.3" +) + +mkdir -p "${ROOT}/include" "${ROOT}/docs/regs" +rm -rf "${ROOT}/docs/regs/hyperbus_cfg_regs" + +uvx "${PEAKRDL_ARGS[@]}" \ + peakrdl regblock \ + --cpuif apb4-flat \ + --default-reset arst_n \ + --module-name hyperbus_cfg_regblock \ + --package-name hyperbus_cfg_regblock_pkg \ + --addr-width 12 \ + -o "${ROOT}/src/regs" \ + "${RDL}" + +uvx "${PEAKRDL_ARGS[@]}" \ + peakrdl c-header \ + -o "${ROOT}/include/hyperbus_cfg_regs.h" \ + "${RDL}" + +uvx "${PEAKRDL_ARGS[@]}" \ + peakrdl markdown \ + -o "${ROOT}/docs/regs/hyperbus_cfg_regs.md" \ + "${RDL}" + +# Keep generated RTL compatible with the repository whitespace checks. +sed -i 's/[[:space:]]\+$//' \ + "${ROOT}/src/regs/hyperbus_cfg_regblock.sv" \ + "${ROOT}/src/regs/hyperbus_cfg_regblock_pkg.sv" diff --git a/scripts/start.tcl b/scripts/start.tcl index 0488812..f4408ad 100644 --- a/scripts/start.tcl +++ b/scripts/start.tcl @@ -2,12 +2,42 @@ # Solderpad Hardware License, Version 0.51, see LICENSE for details. # SPDX-License-Identifier: SHL-0.51 -vsim axi_hyper_tb -t 1ps -voptargs=+acc -classdebug +set regression_failed 0 -set StdArithNoWarnings 1 -set NumericStdNoWarnings 1 -log -r /* +proc run_test {top_name wlf_name} { + global regression_failed -delete wave * + puts "==============================" + puts "= Running $top_name" + puts "==============================" -run -all + set transcript_name "[file rootname $wlf_name].log" + file delete -force $transcript_name + transcript file $transcript_name + + vsim $top_name -wlf $wlf_name -t 1ps -voptargs=+acc -classdebug + + onfinish stop + set StdArithNoWarnings 1 + set NumericStdNoWarnings 1 + log -r /* + + catch {delete wave *} + + run -all + quit -sim + + transcript file {} + set transcript_fd [open $transcript_name r] + set transcript_data [read $transcript_fd] + close $transcript_fd + if {[regexp -line {^# \*\* (Error|Fatal)( \([^)]*\))?:} $transcript_data]} { + puts "Regression errors detected in $transcript_name" + set regression_failed 1 + } +} + +run_test axi_hyper_tb sim_run_axi.wlf +run_test hyperbus_cfg_regs_tb sim_run_cfg_regs.wlf + +quit -code $regression_failed -f diff --git a/src/hyperbus.sv b/src/hyperbus.sv index da287fa..e0889db 100644 --- a/src/hyperbus.sv +++ b/src/hyperbus.sv @@ -21,18 +21,14 @@ module hyperbus #( parameter type axi_ar_chan_t = logic, parameter type axi_r_chan_t = logic, parameter type axi_aw_chan_t = logic, - parameter int unsigned RegAddrWidth = -1, parameter int unsigned RegDataWidth = -1, - parameter int unsigned MinFreqMHz = 100, + parameter int unsigned RegAddrWidth = 32, parameter type reg_req_t = logic, parameter type reg_rsp_t = logic, parameter type axi_rule_t = logic, // The below have sensible defaults, but should be set on integration! parameter int unsigned RxFifoLogDepth = 3, parameter int unsigned TxFifoLogDepth = 3, - parameter logic [RegDataWidth-1:0] RstChipBase = 'h0, // Base address for all chips - parameter logic [RegDataWidth-1:0] RstChipSpace = 'h1_0000, // 64 KiB: Current maximum HyperBus device size - parameter hyperbus_pkg::hyper_cfg_t RstCfg = hyperbus_pkg::gen_RstCfg(NumPhys,MinFreqMHz), parameter int unsigned PhyStartupCycles = 300 * 200, /* us*MHz */ // Conservative maximum frequency estimate parameter int unsigned SyncStages = 2 ) ( @@ -85,9 +81,10 @@ module hyperbus #( logic clk_phy_0, clk_phy_90, rst_phy; // Register file - hyperbus_pkg::hyper_cfg_t cfg; - axi_rule_t [NumChips-1:0] chip_rules; - logic trans_active; + hyperbus_pkg::frontend_cfg_t frontend_cfg; + hyperbus_pkg::phy_cfg_t phy_cfg; + axi_rule_t [NumChips-1:0] chip_rules; + logic trans_active; // AXI slave hyper_rx_t axi_rx; @@ -121,22 +118,26 @@ module hyperbus #( hyperbus_cfg_regs #( .NumChips ( NumChips ), .NumPhys ( NumPhys ), - .RegAddrWidth ( RegAddrWidth ), .RegDataWidth ( RegDataWidth ), + .RegAddrWidth ( RegAddrWidth ), + .CapabilityFeatures ( '0 ), .reg_req_t ( reg_req_t ), .reg_rsp_t ( reg_rsp_t ), - .rule_t ( axi_rule_t ), - .RstChipBase ( RstChipBase ), - .RstChipSpace ( RstChipSpace ), - .RstCfg ( RstCfg ) + .rule_t ( axi_rule_t ) ) i_cfg_regs ( .clk_i ( clk_sys_i ), .rst_ni ( rst_sys_ni ), .reg_req_i ( reg_req_i ), .reg_rsp_o ( reg_rsp_o ), - .cfg_o ( cfg ), + .frontend_cfg_o ( frontend_cfg ), + .phy_cfg_o ( phy_cfg ), .chip_rules_o ( chip_rules ), - .trans_active_i ( trans_active ) + .trans_active_i ( trans_active ), + .cfg_busy_i ( trans_active ), + .decode_error_i ( 1'b0 ), + .cfg_dirty_i ( 1'b0 ), + .flush_req_o ( ), + .apply_req_o ( ) ); // AXI slave interfacing PHY @@ -173,11 +174,8 @@ module hyperbus #( .trans_valid_o ( axi_trans_valid ), .trans_ready_i ( axi_trans_ready ), + .frontend_cfg_i ( frontend_cfg ), .chip_rules_i ( chip_rules ), - .which_phy_i ( cfg.which_phy ), - .phys_in_use_i ( cfg.phys_in_use ), - .addr_mask_msb_i ( cfg.address_mask_msb ), - .addr_space_i ( cfg.address_space ), .trans_active_o ( trans_active ) ); @@ -214,7 +212,7 @@ module hyperbus #( .rst_phy_ni ( rst_phy ), .test_mode_i ( test_mode_i ), - .cfg_i ( cfg ), + .cfg_i ( phy_cfg ), .rx_o ( phy_rx ), .rx_valid_o ( phy_rx_valid ), diff --git a/src/hyperbus_axi.sv b/src/hyperbus_axi.sv index 78b3c7d..bac8778 100644 --- a/src/hyperbus_axi.sv +++ b/src/hyperbus_axi.sv @@ -44,11 +44,8 @@ module hyperbus_axi #( output logic trans_valid_o, input logic trans_ready_i, - input rule_t [NumChips-1:0] chip_rules_i, - input logic phys_in_use_i, - input logic which_phy_i, - input logic [4:0] addr_mask_msb_i, - input logic addr_space_i, + input hyperbus_pkg::frontend_cfg_t frontend_cfg_i, + input rule_t [NumChips-1:0] chip_rules_i, output logic trans_active_o ); @@ -163,7 +160,7 @@ module hyperbus_axi #( logic [1:0] phys_in_use; - assign phys_in_use = (NumPhys==2) ? (phys_in_use_i + 1) : 1; + assign phys_in_use = (NumPhys==2) ? (frontend_cfg_i.phys_in_use + 1) : 1; // ============================ // Serialize requests @@ -305,12 +302,12 @@ module hyperbus_axi #( // AX channel: forward, converting unmasked byte to masked word addresses assign trans_o.write = rr_out_req_write; assign trans_o.burst_type = 1'b1; // Wrapping bursts not (yet) supported - assign trans_o.address_space = addr_space_i; + assign trans_o.address_space = frontend_cfg_i.address_space; assign trans_o.address = (NumPhys == 2) ? - (phys_in_use_i ? - ((rr_out_req_ax.addr & ((32'b1 << addr_mask_msb_i) - 1)) >> 2) : - (((rr_out_req_ax.addr & ((32'b1 << addr_mask_msb_i) - 1)) >> 2) << 1)) : - ((rr_out_req_ax.addr & ((32'b1 << addr_mask_msb_i) - 1)) >> 1); + (frontend_cfg_i.phys_in_use ? + ((rr_out_req_ax.addr & ((32'b1 << frontend_cfg_i.address_mask_msb) - 1)) >> 2) : + (((rr_out_req_ax.addr & ((32'b1 << frontend_cfg_i.address_mask_msb) - 1)) >> 2) << 1)) : + ((rr_out_req_ax.addr & ((32'b1 << frontend_cfg_i.address_mask_msb) - 1)) >> 1); // Convert burst length from decremented, unaligned beats to non-decremented, aligned 16-bit words always_comb begin @@ -365,11 +362,11 @@ module hyperbus_axi #( s_rx_error = rx_i.error; s_rx_data_lower_d = s_rx_data_lower_q; merge_r_d = merge_r_q; - if( (NumPhys==2) & (~phys_in_use_i) ) begin + if( (NumPhys==2) & (~frontend_cfg_i.phys_in_use) ) begin if(rx_valid_i & s_rx_ready) begin merge_r_d = merge_r_q + 1; end - if(~which_phy_i) + if(~frontend_cfg_i.which_phy) s_rx_data = { rx_i.data[PhyDataWidth/2-1:0] , s_rx_data_lower_q }; else s_rx_data = { rx_i.data[PhyDataWidth-1:PhyDataWidth/2] , s_rx_data_lower_q }; @@ -378,7 +375,7 @@ module hyperbus_axi #( s_rx_last = rx_i.last & merge_r_q; s_rx_error = rx_i.error; if(~merge_r_q) begin - if(~which_phy_i) + if(~frontend_cfg_i.which_phy) s_rx_data_lower_d = rx_i.data[PhyDataWidth/2-1:0]; else s_rx_data_lower_d = rx_i.data[PhyDataWidth-1:PhyDataWidth/2]; @@ -469,7 +466,7 @@ module hyperbus_axi #( tx_valid_o = s_tx_valid; s_tx_ready = tx_ready_i; split_w_d = split_w_q; - if( (NumPhys==2) & (~phys_in_use_i) ) begin + if( (NumPhys==2) & (~frontend_cfg_i.phys_in_use) ) begin if(s_tx_valid & tx_ready_i) begin split_w_d = split_w_q+1; end diff --git a/src/hyperbus_cfg_regs.sv b/src/hyperbus_cfg_regs.sv index 70ac78e..22162c5 100644 --- a/src/hyperbus_cfg_regs.sv +++ b/src/hyperbus_cfg_regs.sv @@ -4,133 +4,314 @@ // // Paul Scheffler +`include "common_cells/assertions.svh" + module hyperbus_cfg_regs #( parameter int unsigned NumChips = -1, parameter int unsigned NumPhys = -1, - parameter int unsigned RegAddrWidth = -1, parameter int unsigned RegDataWidth = -1, + parameter int unsigned RegAddrWidth = 32, + parameter logic [7:0] CapabilityFeatures = '0, parameter type reg_req_t = logic, parameter type reg_rsp_t = logic, - parameter type rule_t = logic, - parameter logic [RegDataWidth-1:0] RstChipBase = -1, // Base address for all chips - parameter logic [RegDataWidth-1:0] RstChipSpace = -1, // 64 KiB: Current maximum HyperBus device size - parameter int unsigned MinFreqMHz = 100, - parameter hyperbus_pkg::hyper_cfg_t RstCfg = hyperbus_pkg::gen_RstCfg(NumPhys,MinFreqMHz) + parameter type rule_t = logic ) ( - input logic clk_i, - input logic rst_ni, + input logic clk_i, + input logic rst_ni, input reg_req_t reg_req_i, output reg_rsp_t reg_rsp_o, - output hyperbus_pkg::hyper_cfg_t cfg_o, + output hyperbus_pkg::frontend_cfg_t frontend_cfg_o, + output hyperbus_pkg::phy_cfg_t phy_cfg_o, output rule_t [NumChips-1:0] chip_rules_o, - input trans_active_i + input logic trans_active_i, + input logic cfg_busy_i, + input logic decode_error_i, + input logic cfg_dirty_i, + output logic flush_req_o, + output logic apply_req_o ); `include "common_cells/registers.svh" - // Internal Parameters - localparam int unsigned NumBaseRegs = 12; - localparam int unsigned NumRegs = 2*NumChips + NumBaseRegs; - localparam int unsigned RegsBits = cf_math_pkg::idx_width(NumRegs); - localparam int unsigned RegStrbWidth = RegDataWidth/8; - - // Data and index types - typedef logic [RegsBits-1:0] reg_idx_t; - typedef logic [RegDataWidth-1:0] reg_data_t; - - // Local signals - hyperbus_pkg::hyper_cfg_t cfg_d, cfg_q, cfg_rstval; - reg_data_t [NumChips-1:0][1:0] crange_d, crange_q, crange_rstval; - reg_idx_t sel_reg; - logic sel_reg_mapped; - reg_data_t wmask; - - assign sel_reg = reg_req_i.addr[$clog2(RegStrbWidth) +: RegsBits]; - assign sel_reg_mapped = (sel_reg < NumRegs); - - assign reg_rsp_o.ready = ~trans_active_i; // Config writeable unless currently in transfer - assign reg_rsp_o.error = ~sel_reg_mapped; - - // Read from register - always_comb begin : proc_comb_read - reg_data_t [NumRegs-1:0] rfield; - reg_rsp_o.rdata = '0; - if (sel_reg_mapped) begin - rfield = { - crange_q, - reg_data_t'(cfg_q.csn_to_ck_cycles), - reg_data_t'(cfg_q.t_csh_cycles), - reg_data_t'(cfg_q.which_phy), - reg_data_t'(cfg_q.phys_in_use), - reg_data_t'(cfg_q.address_space), - reg_data_t'(cfg_q.address_mask_msb), - reg_data_t'(cfg_q.t_tx_clk_delay), - reg_data_t'(cfg_q.t_rx_clk_delay), - reg_data_t'(cfg_q.t_read_write_recovery), - reg_data_t'(cfg_q.t_burst_max), - reg_data_t'(cfg_q.en_latency_additional), - reg_data_t'(cfg_q.t_latency_access) - }; - reg_rsp_o.rdata = rfield[sel_reg]; + localparam int unsigned NumChipsMax = 8; + `ASSERT_INIT(NumChipsValid, NumChips >= 1 && NumChips <= NumChipsMax) + `ASSERT_INIT(NumPhysValid, NumPhys == 1 || NumPhys == 2) + `ASSERT_INIT(RegAddrWidthValid, RegAddrWidth >= 12) + `ASSERT_INIT(RegDataWidthValid, RegDataWidth == 32) + + typedef logic [11:0] cfg_addr_t; + typedef logic [31:0] cfg_data_t; + typedef logic [3:0] cfg_strb_t; + + typedef struct packed { + cfg_addr_t addr; + logic write; + cfg_data_t wdata; + cfg_strb_t wstrb; + logic valid; + } cfg_reg_req_t; + + typedef struct packed { + cfg_data_t rdata; + logic error; + logic ready; + } cfg_reg_rsp_t; + + typedef struct packed { + cfg_addr_t paddr; + logic [2:0] pprot; + logic psel; + logic penable; + logic pwrite; + cfg_data_t pwdata; + cfg_strb_t pstrb; + } cfg_apb_req_t; + + typedef struct packed { + logic pready; + cfg_data_t prdata; + logic pslverr; + } cfg_apb_rsp_t; + + hyperbus_cfg_regblock_pkg::hyperbus_cfg_regs__out_t cfg_hwif_out; + hyperbus_cfg_regblock_pkg::hyperbus_cfg_regs__in_t cfg_hwif_in; + rule_t [NumChipsMax-1:0] chip_rules_all; + + cfg_addr_t cfg_addr; + logic cfg_addr_in_window; + logic sel_reg_mapped; + logic cfg_access_active_d, cfg_access_active_q; + logic cfg_access_open; + logic cfg_status_access; + logic cfg_value_valid; + logic unused_cfg_fields; + + cfg_reg_req_t cfg_reg_req; + cfg_reg_rsp_t cfg_reg_rsp; + cfg_apb_req_t cfg_apb_req; + cfg_apb_rsp_t cfg_apb_rsp; + + assign cfg_addr = cfg_addr_t'(reg_req_i.addr); + assign cfg_addr_in_window = reg_req_i.addr == RegAddrWidth'(cfg_addr); + assign cfg_status_access = reg_req_i.valid && + cfg_addr_in_window && (cfg_addr == 12'h010); + + always_comb begin : proc_cfg_addr_mapped + sel_reg_mapped = cfg_addr_in_window && + ((cfg_addr == 12'h000) || + (cfg_addr == 12'h004) || + (cfg_addr == 12'h008) || + (cfg_addr == 12'h00c) || + (cfg_addr == 12'h010) || + (cfg_addr == 12'h100) || + (cfg_addr == 12'h200) || + (cfg_addr == 12'hffc)); + for (int unsigned i = 0; i < 2; i++) begin + sel_reg_mapped |= cfg_addr_in_window && + ((cfg_addr == (12'h300 + i * 12'h40)) || + (cfg_addr == (12'h304 + i * 12'h40))); + end + for (int unsigned i = 0; i < 8; i++) begin + sel_reg_mapped |= cfg_addr_in_window && + ((cfg_addr == (12'h400 + i * 12'h40)) || + (cfg_addr == (12'h404 + i * 12'h40)) || + (cfg_addr == (12'h408 + i * 12'h40)) || + (cfg_addr == (12'h40c + i * 12'h40)) || + (cfg_addr == (12'h410 + i * 12'h40)) || + (cfg_addr == (12'h414 + i * 12'h40)) || + (cfg_addr == (12'h418 + i * 12'h40))); end end + assign cfg_access_open = ~trans_active_i | cfg_access_active_q | cfg_status_access; - // Generate write mask - for (genvar i = 0; unsigned'(i) < RegStrbWidth; ++i ) begin : gen_wmask - assign wmask[8*i +: 8] = {8{reg_req_i.wstrb[i]}}; + always_comb begin : proc_cfg_value_valid + cfg_value_valid = 1'b1; + if (reg_req_i.valid && reg_req_i.write && sel_reg_mapped) begin + // All byte-backed legacy values are range-checked only when their + // corresponding byte is written, preserving partial-write behavior. + if ((cfg_addr == 12'h100) && reg_req_i.wstrb[0]) begin + cfg_value_valid &= (reg_req_i.wdata[7:0] <= 8'd1); + end + if ((cfg_addr == 12'h200) && reg_req_i.wstrb[0]) begin + cfg_value_valid &= (reg_req_i.wdata[7:0] >= 8'd2); + end + if (((cfg_addr == 12'h304) || (cfg_addr == 12'h344)) && + reg_req_i.wstrb[0]) begin + cfg_value_valid &= (reg_req_i.wdata[7:0] <= 8'd15); + end + for (int unsigned i = 0; i < 8; i++) begin + if (cfg_addr == (12'h408 + i * 12'h40)) begin + if (reg_req_i.wstrb[0]) cfg_value_valid &= (reg_req_i.wdata[7:0] <= 8'd1); + if (reg_req_i.wstrb[1]) cfg_value_valid &= (reg_req_i.wdata[15:8] <= 8'd31); + if (reg_req_i.wstrb[2]) cfg_value_valid &= (reg_req_i.wdata[23:16] <= 8'd1); + end + if (cfg_addr == (12'h40c + i * 12'h40)) begin + if (reg_req_i.wstrb[0]) cfg_value_valid &= + (reg_req_i.wdata[7:0] >= 8'd3 && reg_req_i.wdata[7:0] <= 8'd15); + if (reg_req_i.wstrb[1]) cfg_value_valid &= (reg_req_i.wdata[15:8] <= 8'd15); + if (reg_req_i.wstrb[2]) cfg_value_valid &= (reg_req_i.wdata[23:16] <= 8'd1); + end + if (cfg_addr == (12'h414 + i * 12'h40)) begin + if (reg_req_i.wstrb[0]) cfg_value_valid &= (reg_req_i.wdata[7:0] <= 8'd15); + if (reg_req_i.wstrb[1]) cfg_value_valid &= (reg_req_i.wdata[15:8] <= 8'd15); + if (reg_req_i.wstrb[2]) cfg_value_valid &= (reg_req_i.wdata[23:16] <= 8'd15); + end + end + end end - // Write to register - always_comb begin : proc_comb_write - logic chip_reg; - logic [$clog2(NumChips)-1:0] sel_chip; - cfg_d = cfg_q; - crange_d = crange_q; - if (reg_req_i.valid & reg_req_i.write & sel_reg_mapped) begin - case (sel_reg) - 'h0: cfg_d.t_latency_access = (~wmask & cfg_q.t_latency_access ) | (wmask & reg_req_i.wdata); - 'h1: cfg_d.en_latency_additional = (~wmask & cfg_q.en_latency_additional ) | (wmask & reg_req_i.wdata); - 'h2: cfg_d.t_burst_max = (~wmask & cfg_q.t_burst_max ) | (wmask & reg_req_i.wdata); - 'h3: cfg_d.t_read_write_recovery = (~wmask & cfg_q.t_read_write_recovery ) | (wmask & reg_req_i.wdata); - 'h4: cfg_d.t_rx_clk_delay = (~wmask & cfg_q.t_rx_clk_delay ) | (wmask & reg_req_i.wdata); - 'h5: cfg_d.t_tx_clk_delay = (~wmask & cfg_q.t_tx_clk_delay ) | (wmask & reg_req_i.wdata); - 'h6: cfg_d.address_mask_msb = (~wmask & cfg_q.address_mask_msb ) | (wmask & reg_req_i.wdata); - 'h7: cfg_d.address_space = (~wmask & cfg_q.address_space ) | (wmask & reg_req_i.wdata); - 'h8: cfg_d.phys_in_use = (NumPhys==1) ? 0 : ( (~wmask & cfg_q.phys_in_use ) | (wmask & reg_req_i.wdata) ); - 'h9: cfg_d.which_phy = (NumPhys==1) ? 0 : ( (~wmask & cfg_q.which_phy ) | (wmask & reg_req_i.wdata) ); - 'ha: cfg_d.t_csh_cycles = (~wmask & cfg_q.t_csh_cycles ) | (wmask & reg_req_i.wdata); - 'hb: cfg_d.csn_to_ck_cycles = (~wmask & cfg_q.csn_to_ck_cycles ) | (wmask & reg_req_i.wdata); - default: begin - {sel_chip, chip_reg} = sel_reg - NumBaseRegs; - crange_d[sel_chip][chip_reg] = (~wmask & crange_q[sel_chip][chip_reg]) | (wmask & reg_req_i.wdata); - end - endcase // sel_reg + assign reg_rsp_o.ready = cfg_access_open & + (~reg_req_i.valid | ~sel_reg_mapped | ~cfg_value_valid | cfg_reg_rsp.ready); + assign reg_rsp_o.error = (reg_req_i.valid && ~sel_reg_mapped) | + (reg_req_i.valid && reg_req_i.write && sel_reg_mapped && !cfg_value_valid) | + cfg_reg_rsp.error; + assign reg_rsp_o.rdata = sel_reg_mapped ? RegDataWidth'(cfg_reg_rsp.rdata) : '0; + + assign cfg_reg_req.valid = reg_req_i.valid & sel_reg_mapped & cfg_access_open & cfg_value_valid; + assign cfg_reg_req.addr = cfg_addr; + assign cfg_reg_req.write = reg_req_i.write; + assign cfg_reg_req.wdata = 32'(reg_req_i.wdata); + assign cfg_reg_req.wstrb = cfg_strb_t'(reg_req_i.wstrb); + + always_comb begin : proc_cfg_access + cfg_access_active_d = cfg_access_active_q; + if (!cfg_access_active_q && cfg_reg_req.valid && !cfg_status_access) begin + cfg_access_active_d = 1'b1; + end + if (cfg_access_active_q && cfg_reg_rsp.ready) begin + cfg_access_active_d = 1'b0; end end - for (genvar i = 0; unsigned'(i) < NumChips; i++) begin : gen_crange_rstval - assign crange_rstval[i][0] = RstChipBase + (RstChipSpace * i); - assign crange_rstval[i][1] = RstChipBase + (RstChipSpace * (i+1)); // Address decoder: end noninclusive + `FFARN(cfg_access_active_q, cfg_access_active_d, 1'b0, clk_i, rst_ni); + + always_comb begin : proc_chip_rules + chip_rules_all = '0; + for (int unsigned i = 0; i < NumChipsMax; i++) begin + chip_rules_all[i].idx = unsigned'(i); + end + chip_rules_all[0].start_addr = {cfg_hwif_out.chip_0.range_base.value.value, 22'b0}; + chip_rules_all[0].end_addr = {cfg_hwif_out.chip_0.range_bound.value.value, 22'b0}; + chip_rules_all[1].start_addr = {cfg_hwif_out.chip_1.range_base.value.value, 22'b0}; + chip_rules_all[1].end_addr = {cfg_hwif_out.chip_1.range_bound.value.value, 22'b0}; + chip_rules_all[2].start_addr = {cfg_hwif_out.chip_2.range_base.value.value, 22'b0}; + chip_rules_all[2].end_addr = {cfg_hwif_out.chip_2.range_bound.value.value, 22'b0}; + chip_rules_all[3].start_addr = {cfg_hwif_out.chip_3.range_base.value.value, 22'b0}; + chip_rules_all[3].end_addr = {cfg_hwif_out.chip_3.range_bound.value.value, 22'b0}; + chip_rules_all[4].start_addr = {cfg_hwif_out.chip_4.range_base.value.value, 22'b0}; + chip_rules_all[4].end_addr = {cfg_hwif_out.chip_4.range_bound.value.value, 22'b0}; + chip_rules_all[5].start_addr = {cfg_hwif_out.chip_5.range_base.value.value, 22'b0}; + chip_rules_all[5].end_addr = {cfg_hwif_out.chip_5.range_bound.value.value, 22'b0}; + chip_rules_all[6].start_addr = {cfg_hwif_out.chip_6.range_base.value.value, 22'b0}; + chip_rules_all[6].end_addr = {cfg_hwif_out.chip_6.range_bound.value.value, 22'b0}; + chip_rules_all[7].start_addr = {cfg_hwif_out.chip_7.range_base.value.value, 22'b0}; + chip_rules_all[7].end_addr = {cfg_hwif_out.chip_7.range_bound.value.value, 22'b0}; end - // Registers - `FFARN(cfg_q, cfg_d, RstCfg, clk_i, rst_ni); - `FFARN(crange_q, crange_d, crange_rstval, clk_i, rst_ni); + assign cfg_hwif_in.global_cfg.capability.num_chips.next = 8'(NumChips); + assign cfg_hwif_in.global_cfg.capability.num_phys.next = 8'(NumPhys); + assign cfg_hwif_in.global_cfg.capability.per_chip_cfg.next = CapabilityFeatures[0]; + assign cfg_hwif_in.global_cfg.capability.per_phy_cfg.next = CapabilityFeatures[1]; + assign cfg_hwif_in.global_cfg.capability.chip_enable.next = CapabilityFeatures[2]; + assign cfg_hwif_in.global_cfg.capability.clock_divider.next = CapabilityFeatures[3]; + assign cfg_hwif_in.global_cfg.capability.staged_apply.next = CapabilityFeatures[4]; + assign cfg_hwif_in.global_cfg.capability.error_status.next = CapabilityFeatures[5]; + assign cfg_hwif_in.global_cfg.capability.rwds_sample_timing.next = + CapabilityFeatures[6]; + assign cfg_hwif_in.global_cfg.capability.rwds_oe_timing.next = CapabilityFeatures[7]; + assign cfg_hwif_in.global_cfg.status.decode_error.next = + cfg_hwif_out.global_cfg.status.decode_error.value; + assign cfg_hwif_in.global_cfg.status.decode_error.hwset = decode_error_i; + assign cfg_hwif_in.global_cfg.status.busy.next = cfg_busy_i; + assign cfg_hwif_in.global_cfg.status.dirty.next = cfg_dirty_i; + assign flush_req_o = cfg_hwif_out.global_cfg.command.flush.value; + assign apply_req_o = cfg_hwif_out.global_cfg.command.apply.value; + + reg_to_apb #( + .reg_req_t ( cfg_reg_req_t ), + .reg_rsp_t ( cfg_reg_rsp_t ), + .apb_req_t ( cfg_apb_req_t ), + .apb_rsp_t ( cfg_apb_rsp_t ) + ) i_reg_to_apb ( + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .reg_req_i ( cfg_reg_req ), + .reg_rsp_o ( cfg_reg_rsp ), + .apb_req_o ( cfg_apb_req ), + .apb_rsp_i ( cfg_apb_rsp ) + ); - // Outputs - assign cfg_o = cfg_q; - for (genvar i = 0; unsigned'(i) < NumChips; ++i) begin : gen_crange_out - assign chip_rules_o[i].idx = unsigned'(i); // No overlap: keep indices sequential - assign chip_rules_o[i].start_addr = crange_q[i][0]; - assign chip_rules_o[i].end_addr = crange_q[i][1]; + hyperbus_cfg_regblock i_cfg_regblock ( + .clk ( clk_i ), + .arst_n ( rst_ni ), + .s_apb_psel ( cfg_apb_req.psel ), + .s_apb_penable ( cfg_apb_req.penable ), + .s_apb_pwrite ( cfg_apb_req.pwrite ), + .s_apb_pprot ( cfg_apb_req.pprot ), + .s_apb_paddr ( cfg_apb_req.paddr ), + .s_apb_pwdata ( cfg_apb_req.pwdata ), + .s_apb_pstrb ( cfg_apb_req.pstrb ), + .s_apb_pready ( cfg_apb_rsp.pready ), + .s_apb_prdata ( cfg_apb_rsp.prdata ), + .s_apb_pslverr ( cfg_apb_rsp.pslverr ), + .hwif_in ( cfg_hwif_in ), + .hwif_out ( cfg_hwif_out ) + ); + + always_comb begin : proc_cfg_output + frontend_cfg_o = '0; + phy_cfg_o = '0; + + frontend_cfg_o.address_mask_msb = cfg_hwif_out.chip_0.address_cfg.address_mask_msb.value; + frontend_cfg_o.address_space = cfg_hwif_out.chip_0.address_cfg.address_space.value[0]; + frontend_cfg_o.phys_in_use = (NumPhys == 2) && + cfg_hwif_out.frontend.frontend_cfg.dual_phy.value; + frontend_cfg_o.which_phy = 1'b0; + + phy_cfg_o.chip.t_latency_access = cfg_hwif_out.chip_0.latency_cfg.t_latency_access.value; + phy_cfg_o.chip.en_latency_additional = cfg_hwif_out.chip_0.latency_cfg.en_latency_additional.value; + phy_cfg_o.chip.t_burst_max = cfg_hwif_out.chip_0.burst_cfg.t_burst_max.value; + phy_cfg_o.chip.t_read_write_recovery = cfg_hwif_out.chip_0.chip_timing.t_read_write_recovery.value; + phy_cfg_o.chip.t_rx_clk_delay = cfg_hwif_out.chip_0.rx_delay.value.value; + phy_cfg_o.chip.t_csh_cycles = cfg_hwif_out.chip_0.chip_timing.t_csh_cycles.value; + phy_cfg_o.chip.csn_to_ck_cycles = cfg_hwif_out.chip_0.chip_timing.csn_to_ck_cycles.value; + phy_cfg_o.t_tx_clk_delay = cfg_hwif_out.phy_0.tx_delay.value.value; + phy_cfg_o.phys_in_use = (NumPhys == 2) && + cfg_hwif_out.frontend.frontend_cfg.dual_phy.value; + phy_cfg_o.which_phy = 1'b0; end - // pragma translate_off - `ifndef VERILATOR - initial assert (RegDataWidth >= 16 && $countones(RegDataWidth) == 1) - else $error("RegDataWidth must be a power of two bigger than 16."); - `endif - // pragma translate_on + // The legacy PR34 interface has no destinations for these newer fields. + always_comb begin : proc_unused_cfg_fields + unused_cfg_fields = ^cfg_hwif_out.backend.clock_cfg.divider.value; + unused_cfg_fields |= ^cfg_hwif_out.phy_0.rwds_timing.rwds_oe_setup_cycles.value; + unused_cfg_fields |= ^cfg_hwif_out.phy_1.rwds_timing.rwds_oe_setup_cycles.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_0.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_0.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_1.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_1.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_2.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_2.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_3.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_3.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_4.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_4.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_5.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_5.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_6.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_6.latency_cfg.rwds_sample_delay.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_7.address_cfg.enable.value; + unused_cfg_fields |= ^cfg_hwif_out.chip_7.latency_cfg.rwds_sample_delay.value; + end + + for (genvar i = 0; unsigned'(i) < NumChipsMax; i++) begin : gen_chip_rules + if (i < NumChips) begin : gen_active + assign chip_rules_o[i] = chip_rules_all[i]; + end else begin : gen_inactive + logic unused_chip_rule; + assign unused_chip_rule = ^chip_rules_all[i]; + end + end endmodule : hyperbus_cfg_regs diff --git a/src/hyperbus_phy.sv b/src/hyperbus_phy.sv index 43a5a8d..11c9f84 100644 --- a/src/hyperbus_phy.sv +++ b/src/hyperbus_phy.sv @@ -22,7 +22,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( input logic rst_ni, input logic test_mode_i, // Config registers - input hyper_cfg_t cfg_i, + input phy_cfg_t cfg_i, // PHY control status output logic busy_o, // Transactions @@ -133,7 +133,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( .tx_data_oe_i ( trx_tx_data_oe ), .tx_rwds_i ( trx_tx_rwds ), .tx_rwds_oe_i ( trx_tx_rwds_oe ), - .rx_clk_delay_i ( cfg_i.t_rx_clk_delay ), + .rx_clk_delay_i ( cfg_i.chip.t_rx_clk_delay ), .rx_clk_set_i ( trx_rx_clk_set ), .rx_clk_reset_i ( trx_rx_clk_reset ), .rx_data_o ( trx_rx_data ), @@ -221,8 +221,8 @@ module hyperbus_phy import hyperbus_pkg::*; #( // Auxiliary control signals assign ctl_write_zero_lat = tf_q.address_space & tf_q.write; - // cfg_i.en_latency_additional overwrites the sampled RWDS value. - assign ctl_add_latency = trx_rwds_sample | cfg_i.en_latency_additional; + // cfg_i.chip.en_latency_additional overwrites the sampled RWDS value. + assign ctl_add_latency = trx_rwds_sample | cfg_i.chip.en_latency_additional; assign ctl_tf_burst_last = (tf_q.burst == 1) || (tf_q.burst == phys_in_use); assign ctl_tf_burst_done = (tf_q.burst == 0); @@ -272,11 +272,11 @@ module hyperbus_phy import hyperbus_pkg::*; #( cs_d = trans_cs_i; add_latency_d = 1'b0; - if(cfg_i.csn_to_ck_cycles != 0) begin + if(cfg_i.chip.csn_to_ck_cycles != 0) begin // assert CS but delay hyper_ck to allow more time // for memory to drive RWDS (to satisfy t_DSV) state_d = DelayCK; - timer_d = cfg_i.csn_to_ck_cycles -1; + timer_d = cfg_i.chip.csn_to_ck_cycles -1; end else begin // max throughput when memory RWDS signal arrives early state_d = SendCA; @@ -305,10 +305,10 @@ module hyperbus_phy import hyperbus_pkg::*; #( trx_rwds_sample_ena = ~ctl_write_zero_lat; if (ctl_timer_zero) begin if (ctl_write_zero_lat) begin - timer_d = cfg_i.t_burst_max; + timer_d = cfg_i.chip.t_burst_max; state_d = Write; end else begin - timer_d = TimerWidth'(cfg_i.t_latency_access); + timer_d = TimerWidth'(cfg_i.chip.t_latency_access); add_latency_d = ctl_add_latency; state_d = WaitLatAccess; end @@ -325,7 +325,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( if (~add_latency_q) begin // Substract cycle for last CA and another for state delay if(ctl_timer_two) begin - timer_d = cfg_i.t_burst_max; + timer_d = cfg_i.chip.t_burst_max; // Switch to write or read phase and already start // turnaround of tri-state driver (depending on latency // config and if read or write transaction). @@ -345,7 +345,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( end else if (ctl_timer_one) begin // instead of going to 0, add another latency count state_d = WaitAddLatAccess; - timer_d = TimerWidth'(cfg_i.t_latency_access); + timer_d = TimerWidth'(cfg_i.chip.t_latency_access); add_latency_d = 1'b0; end end @@ -355,7 +355,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( trx_clk_ena = 1'b1; trx_tx_data_oe = 1'b1; if (ctl_timer_two) begin - timer_d = cfg_i.t_burst_max; + timer_d = cfg_i.chip.t_burst_max; if (tf_q.write) begin state_d = Write; trx_tx_data_oe = 1'b1; @@ -376,13 +376,13 @@ module hyperbus_phy import hyperbus_pkg::*; #( tf_d.burst = tf_q.burst - phys_in_use; tf_d.address = tf_q.address + 1; if (ctl_tf_burst_last) begin - timer_d = cfg_i.t_csh_cycles; + timer_d = cfg_i.chip.t_csh_cycles; state_d = WaitXfer; end end // Force-terminate access on burst time limit if (ctl_timer_one) begin - timer_d = cfg_i.t_csh_cycles; + timer_d = cfg_i.chip.t_csh_cycles; state_d = WaitXfer; end end @@ -398,13 +398,13 @@ module hyperbus_phy import hyperbus_pkg::*; #( tf_d.address = tf_q.address + 1; if (ctl_tf_burst_last) begin b_pending_set = 1'b1; - timer_d = cfg_i.t_csh_cycles; + timer_d = cfg_i.chip.t_csh_cycles; state_d = WaitXfer; end end // Force-terminate access on burst time limit if (ctl_timer_one) begin - timer_d = cfg_i.t_csh_cycles; + timer_d = cfg_i.chip.t_csh_cycles; state_d = WaitXfer; end end @@ -412,7 +412,7 @@ module hyperbus_phy import hyperbus_pkg::*; #( // Wait for FFed Clock and output to stop // May have to be prolonged for potential future devices with t_CSH > 0 if (ctl_timer_zero) begin - timer_d = cfg_i.t_read_write_recovery; + timer_d = cfg_i.chip.t_read_write_recovery; state_d = WaitRWR; end end diff --git a/src/hyperbus_phy_if.sv b/src/hyperbus_phy_if.sv index ac165af..baf51f7 100644 --- a/src/hyperbus_phy_if.sv +++ b/src/hyperbus_phy_if.sv @@ -22,7 +22,7 @@ module hyperbus_phy_if import hyperbus_pkg::*; #( input logic rst_phy_ni, input logic test_mode_i, // Config registers - input hyper_cfg_t cfg_i, + input phy_cfg_t cfg_i, // Transactions input logic trans_valid_i, output logic trans_ready_o, diff --git a/src/hyperbus_pkg.sv b/src/hyperbus_pkg.sv index 3f97a7a..49149ef 100644 --- a/src/hyperbus_pkg.sv +++ b/src/hyperbus_pkg.sv @@ -15,14 +15,23 @@ package hyperbus_pkg; logic [15:0] t_burst_max; logic [3:0] t_read_write_recovery; logic [7:0] t_rx_clk_delay; - logic [7:0] t_tx_clk_delay; + logic [3:0] t_csh_cycles; // configurable t_CSH for high-frequency operation (200 MHz HyperRAM) + logic [3:0] csn_to_ck_cycles; // delay hyper_ck after CS is asserted (more time for t_DSV) + } chip_phy_cfg_t; + + typedef struct packed { logic [4:0] address_mask_msb; logic address_space; logic phys_in_use; logic which_phy; - logic [3:0] t_csh_cycles; // configurable t_CSH for high-frequency operation (200 MHz HyperRAM) - logic [3:0] csn_to_ck_cycles; // delay hyper_ck after CS is asserted (more time for t_DSV) - } hyper_cfg_t; + } frontend_cfg_t; + + typedef struct packed { + chip_phy_cfg_t chip; + logic [7:0] t_tx_clk_delay; + logic phys_in_use; + logic which_phy; + } phy_cfg_t; typedef struct packed { logic write; // transaction is a write @@ -60,28 +69,4 @@ package hyperbus_pkg; logic [2:0] addr_lower; } hyper_phy_ca_t; - - // Register reset values - function automatic hyper_cfg_t gen_RstCfg(input int unsigned NumPhys, input int unsigned MinFreqMhz); - // MinFreqMHz = 100 is spec-compliant and should not be changed. - // It can be lowered if this frequency is not reachable in operation (this may not work with certain HyperBus devices). - // >200 is outside the spec and is unlikely to work with any HyperBus devices - automatic hyper_cfg_t cfg = hyper_cfg_t'{ - t_latency_access: 'h6, - en_latency_additional: 'b0, - t_burst_max: ((MinFreqMhz*35)/10), // t_{csm}: At lowest legal clock (100 MHz) 3.5us (0.5us safety margin) - t_read_write_recovery: 'h6, - t_rx_clk_delay: 'h10, - t_tx_clk_delay: 'h10, - address_mask_msb: 'd25, // 2^(address mask MSB) = single chip size [bytes] - address_space: 'b0, - phys_in_use: NumPhys-1, - which_phy: NumPhys-1, - t_csh_cycles: 'h1, - csn_to_ck_cycles: 4'h0 // additional cycles from CS_N going low to start of hyper_ck - }; - - return cfg; - endfunction - endpackage diff --git a/src/hyperbus_synth_wrap.sv b/src/hyperbus_synth_wrap.sv index 8b1935e..ed9ccc4 100644 --- a/src/hyperbus_synth_wrap.sv +++ b/src/hyperbus_synth_wrap.sv @@ -145,8 +145,8 @@ module hyperbus_lint_wrap #( .axi_ar_chan_t ( ar_chan_t ), .axi_r_chan_t ( r_chan_t ), .axi_aw_chan_t ( aw_chan_t ), - .RegAddrWidth ( RegAddrWidth ), .RegDataWidth ( RegDataWidth ), + .RegAddrWidth ( RegAddrWidth ), .reg_req_t ( reg_req_t ), .reg_rsp_t ( reg_rsp_t ), .axi_rule_t ( axi_rule_t ) diff --git a/src/regs/hyperbus_cfg_regblock.sv b/src/regs/hyperbus_cfg_regblock.sv new file mode 100644 index 0000000..ec72f2c --- /dev/null +++ b/src/regs/hyperbus_cfg_regblock.sv @@ -0,0 +1,4665 @@ +// Generated by PeakRDL-regblock - A free and open-source SystemVerilog generator +// https://github.com/SystemRDL/PeakRDL-regblock + +module hyperbus_cfg_regblock ( + input wire clk, + input wire arst_n, + + input wire s_apb_psel, + input wire s_apb_penable, + input wire s_apb_pwrite, + input wire [2:0] s_apb_pprot, + input wire [11:0] s_apb_paddr, + input wire [31:0] s_apb_pwdata, + input wire [3:0] s_apb_pstrb, + output logic s_apb_pready, + output logic [31:0] s_apb_prdata, + output logic s_apb_pslverr, + + input hyperbus_cfg_regblock_pkg::hyperbus_cfg_regs__in_t hwif_in, + output hyperbus_cfg_regblock_pkg::hyperbus_cfg_regs__out_t hwif_out + ); + + //-------------------------------------------------------------------------- + // CPU Bus interface logic + //-------------------------------------------------------------------------- + logic cpuif_req; + logic cpuif_req_is_wr; + logic [11:0] cpuif_addr; + logic [31:0] cpuif_wr_data; + logic [31:0] cpuif_wr_biten; + logic cpuif_req_stall_wr; + logic cpuif_req_stall_rd; + + logic cpuif_rd_ack; + logic cpuif_rd_err; + logic [31:0] cpuif_rd_data; + + logic cpuif_wr_ack; + logic cpuif_wr_err; + + // Request + logic is_active; + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + is_active <= '0; + cpuif_req <= '0; + cpuif_req_is_wr <= '0; + cpuif_addr <= '0; + cpuif_wr_data <= '0; + cpuif_wr_biten <= '0; + end else begin + if(~is_active) begin + if(s_apb_psel) begin + is_active <= '1; + cpuif_req <= '1; + cpuif_req_is_wr <= s_apb_pwrite; + cpuif_addr <= {s_apb_paddr[11:2], 2'b0}; + cpuif_wr_data <= s_apb_pwdata; + for(int i=0; i<4; i++) begin + cpuif_wr_biten[i*8 +: 8] <= {8{s_apb_pstrb[i]}}; + end + end + end else begin + cpuif_req <= '0; + if(cpuif_rd_ack || cpuif_wr_ack) begin + is_active <= '0; + end + end + end + end + + // Response + assign s_apb_pready = cpuif_rd_ack | cpuif_wr_ack; + assign s_apb_prdata = cpuif_rd_data; + assign s_apb_pslverr = cpuif_rd_err | cpuif_wr_err; + + logic cpuif_req_masked; + + // Read & write latencies are balanced. Stalls not required + assign cpuif_req_stall_rd = '0; + assign cpuif_req_stall_wr = '0; + assign cpuif_req_masked = cpuif_req + & !(!cpuif_req_is_wr & cpuif_req_stall_rd) + & !(cpuif_req_is_wr & cpuif_req_stall_wr); + + //-------------------------------------------------------------------------- + // Address Decode + //-------------------------------------------------------------------------- + typedef struct { + struct { + logic ip_version; + logic reg_if_version; + logic capability; + logic command; + logic status; + } global_cfg; + struct { + logic frontend_cfg; + } frontend; + struct { + logic clock_cfg; + } backend; + struct { + logic tx_delay; + logic rwds_timing; + } phy_0; + struct { + logic tx_delay; + logic rwds_timing; + } phy_1; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_0; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_1; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_2; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_3; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_4; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_5; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_6; + struct { + logic range_base; + logic range_bound; + logic address_cfg; + logic latency_cfg; + logic burst_cfg; + logic chip_timing; + logic rx_delay; + } chip_7; + logic reserved_top; + } decoded_reg_strb_t; + decoded_reg_strb_t decoded_reg_strb; + logic decoded_err; + logic [11:0] decoded_addr; + logic decoded_req; + logic decoded_req_is_wr; + logic [31:0] decoded_wr_data; + logic [31:0] decoded_wr_biten; + + always_comb begin + automatic logic is_valid_addr; + automatic logic is_valid_rw; + is_valid_addr = '1; // No valid address check + is_valid_rw = '1; // No valid RW check + decoded_reg_strb.global_cfg.ip_version = cpuif_req_masked & (cpuif_addr == 12'h0) & !cpuif_req_is_wr; + decoded_reg_strb.global_cfg.reg_if_version = cpuif_req_masked & (cpuif_addr == 12'h4) & !cpuif_req_is_wr; + decoded_reg_strb.global_cfg.capability = cpuif_req_masked & (cpuif_addr == 12'h8) & !cpuif_req_is_wr; + decoded_reg_strb.global_cfg.command = cpuif_req_masked & (cpuif_addr == 12'hc); + decoded_reg_strb.global_cfg.status = cpuif_req_masked & (cpuif_addr == 12'h10); + decoded_reg_strb.frontend.frontend_cfg = cpuif_req_masked & (cpuif_addr == 12'h100); + decoded_reg_strb.backend.clock_cfg = cpuif_req_masked & (cpuif_addr == 12'h200); + decoded_reg_strb.phy_0.tx_delay = cpuif_req_masked & (cpuif_addr == 12'h300); + decoded_reg_strb.phy_0.rwds_timing = cpuif_req_masked & (cpuif_addr == 12'h304); + decoded_reg_strb.phy_1.tx_delay = cpuif_req_masked & (cpuif_addr == 12'h340); + decoded_reg_strb.phy_1.rwds_timing = cpuif_req_masked & (cpuif_addr == 12'h344); + decoded_reg_strb.chip_0.range_base = cpuif_req_masked & (cpuif_addr == 12'h400); + decoded_reg_strb.chip_0.range_bound = cpuif_req_masked & (cpuif_addr == 12'h404); + decoded_reg_strb.chip_0.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h408); + decoded_reg_strb.chip_0.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h40c); + decoded_reg_strb.chip_0.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h410); + decoded_reg_strb.chip_0.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h414); + decoded_reg_strb.chip_0.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h418); + decoded_reg_strb.chip_1.range_base = cpuif_req_masked & (cpuif_addr == 12'h440); + decoded_reg_strb.chip_1.range_bound = cpuif_req_masked & (cpuif_addr == 12'h444); + decoded_reg_strb.chip_1.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h448); + decoded_reg_strb.chip_1.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h44c); + decoded_reg_strb.chip_1.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h450); + decoded_reg_strb.chip_1.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h454); + decoded_reg_strb.chip_1.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h458); + decoded_reg_strb.chip_2.range_base = cpuif_req_masked & (cpuif_addr == 12'h480); + decoded_reg_strb.chip_2.range_bound = cpuif_req_masked & (cpuif_addr == 12'h484); + decoded_reg_strb.chip_2.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h488); + decoded_reg_strb.chip_2.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h48c); + decoded_reg_strb.chip_2.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h490); + decoded_reg_strb.chip_2.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h494); + decoded_reg_strb.chip_2.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h498); + decoded_reg_strb.chip_3.range_base = cpuif_req_masked & (cpuif_addr == 12'h4c0); + decoded_reg_strb.chip_3.range_bound = cpuif_req_masked & (cpuif_addr == 12'h4c4); + decoded_reg_strb.chip_3.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h4c8); + decoded_reg_strb.chip_3.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h4cc); + decoded_reg_strb.chip_3.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h4d0); + decoded_reg_strb.chip_3.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h4d4); + decoded_reg_strb.chip_3.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h4d8); + decoded_reg_strb.chip_4.range_base = cpuif_req_masked & (cpuif_addr == 12'h500); + decoded_reg_strb.chip_4.range_bound = cpuif_req_masked & (cpuif_addr == 12'h504); + decoded_reg_strb.chip_4.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h508); + decoded_reg_strb.chip_4.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h50c); + decoded_reg_strb.chip_4.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h510); + decoded_reg_strb.chip_4.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h514); + decoded_reg_strb.chip_4.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h518); + decoded_reg_strb.chip_5.range_base = cpuif_req_masked & (cpuif_addr == 12'h540); + decoded_reg_strb.chip_5.range_bound = cpuif_req_masked & (cpuif_addr == 12'h544); + decoded_reg_strb.chip_5.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h548); + decoded_reg_strb.chip_5.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h54c); + decoded_reg_strb.chip_5.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h550); + decoded_reg_strb.chip_5.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h554); + decoded_reg_strb.chip_5.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h558); + decoded_reg_strb.chip_6.range_base = cpuif_req_masked & (cpuif_addr == 12'h580); + decoded_reg_strb.chip_6.range_bound = cpuif_req_masked & (cpuif_addr == 12'h584); + decoded_reg_strb.chip_6.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h588); + decoded_reg_strb.chip_6.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h58c); + decoded_reg_strb.chip_6.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h590); + decoded_reg_strb.chip_6.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h594); + decoded_reg_strb.chip_6.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h598); + decoded_reg_strb.chip_7.range_base = cpuif_req_masked & (cpuif_addr == 12'h5c0); + decoded_reg_strb.chip_7.range_bound = cpuif_req_masked & (cpuif_addr == 12'h5c4); + decoded_reg_strb.chip_7.address_cfg = cpuif_req_masked & (cpuif_addr == 12'h5c8); + decoded_reg_strb.chip_7.latency_cfg = cpuif_req_masked & (cpuif_addr == 12'h5cc); + decoded_reg_strb.chip_7.burst_cfg = cpuif_req_masked & (cpuif_addr == 12'h5d0); + decoded_reg_strb.chip_7.chip_timing = cpuif_req_masked & (cpuif_addr == 12'h5d4); + decoded_reg_strb.chip_7.rx_delay = cpuif_req_masked & (cpuif_addr == 12'h5d8); + decoded_reg_strb.reserved_top = cpuif_req_masked & (cpuif_addr == 12'hffc) & !cpuif_req_is_wr; + decoded_err = '0; + end + + // Pass down signals to next stage + assign decoded_addr = cpuif_addr; + assign decoded_req = cpuif_req_masked; + assign decoded_req_is_wr = cpuif_req_is_wr; + assign decoded_wr_data = cpuif_wr_data; + assign decoded_wr_biten = cpuif_wr_biten; + + //-------------------------------------------------------------------------- + // Field logic + //-------------------------------------------------------------------------- + typedef struct { + struct { + struct { + struct { + logic [7:0] next; + logic load_next; + } num_chips; + struct { + logic [7:0] next; + logic load_next; + } num_phys; + struct { + logic next; + logic load_next; + } per_chip_cfg; + struct { + logic next; + logic load_next; + } per_phy_cfg; + struct { + logic next; + logic load_next; + } chip_enable; + struct { + logic next; + logic load_next; + } clock_divider; + struct { + logic next; + logic load_next; + } staged_apply; + struct { + logic next; + logic load_next; + } error_status; + struct { + logic next; + logic load_next; + } rwds_sample_timing; + struct { + logic next; + logic load_next; + } rwds_oe_timing; + } capability; + struct { + struct { + logic next; + logic load_next; + } flush; + struct { + logic next; + logic load_next; + } apply; + } command; + struct { + struct { + logic next; + logic load_next; + } decode_error; + struct { + logic next; + logic load_next; + } busy; + struct { + logic next; + logic load_next; + } dirty; + } status; + } global_cfg; + struct { + struct { + struct { + logic next; + logic load_next; + } dual_phy; + } frontend_cfg; + } frontend; + struct { + struct { + struct { + logic [7:0] next; + logic load_next; + } divider; + } clock_cfg; + } backend; + struct { + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } tx_delay; + struct { + struct { + logic [7:0] next; + logic load_next; + } rwds_oe_setup_cycles; + } rwds_timing; + } phy_0; + struct { + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } tx_delay; + struct { + struct { + logic [7:0] next; + logic load_next; + } rwds_oe_setup_cycles; + } rwds_timing; + } phy_1; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_0; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_1; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_2; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_3; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_4; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_5; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_6; + struct { + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_base; + struct { + struct { + logic [9:0] next; + logic load_next; + } value; + } range_bound; + struct { + struct { + logic [7:0] next; + logic load_next; + } address_space; + struct { + logic [7:0] next; + logic load_next; + } address_mask_msb; + struct { + logic next; + logic load_next; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_latency_access; + struct { + logic [7:0] next; + logic load_next; + } rwds_sample_delay; + struct { + logic next; + logic load_next; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] next; + logic load_next; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] next; + logic load_next; + } t_read_write_recovery; + struct { + logic [7:0] next; + logic load_next; + } t_csh_cycles; + struct { + logic [7:0] next; + logic load_next; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] next; + logic load_next; + } value; + } rx_delay; + } chip_7; + } field_combo_t; + field_combo_t field_combo; + + typedef struct { + struct { + struct { + struct { + logic [7:0] value; + } num_chips; + struct { + logic [7:0] value; + } num_phys; + struct { + logic value; + } per_chip_cfg; + struct { + logic value; + } per_phy_cfg; + struct { + logic value; + } chip_enable; + struct { + logic value; + } clock_divider; + struct { + logic value; + } staged_apply; + struct { + logic value; + } error_status; + struct { + logic value; + } rwds_sample_timing; + struct { + logic value; + } rwds_oe_timing; + } capability; + struct { + struct { + logic value; + } flush; + struct { + logic value; + } apply; + } command; + struct { + struct { + logic value; + } decode_error; + struct { + logic value; + } busy; + struct { + logic value; + } dirty; + } status; + } global_cfg; + struct { + struct { + struct { + logic value; + } dual_phy; + } frontend_cfg; + } frontend; + struct { + struct { + struct { + logic [7:0] value; + } divider; + } clock_cfg; + } backend; + struct { + struct { + struct { + logic [7:0] value; + } value; + } tx_delay; + struct { + struct { + logic [7:0] value; + } rwds_oe_setup_cycles; + } rwds_timing; + } phy_0; + struct { + struct { + struct { + logic [7:0] value; + } value; + } tx_delay; + struct { + struct { + logic [7:0] value; + } rwds_oe_setup_cycles; + } rwds_timing; + } phy_1; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_0; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_1; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_2; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_3; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_4; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_5; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_6; + struct { + struct { + struct { + logic [9:0] value; + } value; + } range_base; + struct { + struct { + logic [9:0] value; + } value; + } range_bound; + struct { + struct { + logic [7:0] value; + } address_space; + struct { + logic [7:0] value; + } address_mask_msb; + struct { + logic value; + } enable; + } address_cfg; + struct { + struct { + logic [7:0] value; + } t_latency_access; + struct { + logic [7:0] value; + } rwds_sample_delay; + struct { + logic value; + } en_latency_additional; + } latency_cfg; + struct { + struct { + logic [15:0] value; + } t_burst_max; + } burst_cfg; + struct { + struct { + logic [7:0] value; + } t_read_write_recovery; + struct { + logic [7:0] value; + } t_csh_cycles; + struct { + logic [7:0] value; + } csn_to_ck_cycles; + } chip_timing; + struct { + struct { + logic [7:0] value; + } value; + } rx_delay; + } chip_7; + } field_storage_t; + field_storage_t field_storage; + + assign hwif_out.global_cfg.ip_version.revision.value = 8'h0; + assign hwif_out.global_cfg.ip_version.patch.value = 8'h9; + assign hwif_out.global_cfg.ip_version.minor.value = 8'h0; + assign hwif_out.global_cfg.ip_version.major.value = 8'h0; + assign hwif_out.global_cfg.reg_if_version.minor.value = 16'h0; + assign hwif_out.global_cfg.reg_if_version.major.value = 16'h1; + // Field: hyperbus_cfg_regs.global_cfg.capability.num_chips + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.num_chips.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.num_chips.next; + load_next_c = '1; + field_combo.global_cfg.capability.num_chips.next = next_c; + field_combo.global_cfg.capability.num_chips.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.num_chips.value <= 8'h0; + end else begin + if(field_combo.global_cfg.capability.num_chips.load_next) begin + field_storage.global_cfg.capability.num_chips.value <= field_combo.global_cfg.capability.num_chips.next; + end + end + end + assign hwif_out.global_cfg.capability.num_chips.value = field_storage.global_cfg.capability.num_chips.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.num_phys + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.num_phys.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.num_phys.next; + load_next_c = '1; + field_combo.global_cfg.capability.num_phys.next = next_c; + field_combo.global_cfg.capability.num_phys.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.num_phys.value <= 8'h0; + end else begin + if(field_combo.global_cfg.capability.num_phys.load_next) begin + field_storage.global_cfg.capability.num_phys.value <= field_combo.global_cfg.capability.num_phys.next; + end + end + end + assign hwif_out.global_cfg.capability.num_phys.value = field_storage.global_cfg.capability.num_phys.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.per_chip_cfg + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.per_chip_cfg.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.per_chip_cfg.next; + load_next_c = '1; + field_combo.global_cfg.capability.per_chip_cfg.next = next_c; + field_combo.global_cfg.capability.per_chip_cfg.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.per_chip_cfg.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.per_chip_cfg.load_next) begin + field_storage.global_cfg.capability.per_chip_cfg.value <= field_combo.global_cfg.capability.per_chip_cfg.next; + end + end + end + assign hwif_out.global_cfg.capability.per_chip_cfg.value = field_storage.global_cfg.capability.per_chip_cfg.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.per_phy_cfg + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.per_phy_cfg.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.per_phy_cfg.next; + load_next_c = '1; + field_combo.global_cfg.capability.per_phy_cfg.next = next_c; + field_combo.global_cfg.capability.per_phy_cfg.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.per_phy_cfg.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.per_phy_cfg.load_next) begin + field_storage.global_cfg.capability.per_phy_cfg.value <= field_combo.global_cfg.capability.per_phy_cfg.next; + end + end + end + assign hwif_out.global_cfg.capability.per_phy_cfg.value = field_storage.global_cfg.capability.per_phy_cfg.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.chip_enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.chip_enable.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.chip_enable.next; + load_next_c = '1; + field_combo.global_cfg.capability.chip_enable.next = next_c; + field_combo.global_cfg.capability.chip_enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.chip_enable.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.chip_enable.load_next) begin + field_storage.global_cfg.capability.chip_enable.value <= field_combo.global_cfg.capability.chip_enable.next; + end + end + end + assign hwif_out.global_cfg.capability.chip_enable.value = field_storage.global_cfg.capability.chip_enable.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.clock_divider + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.clock_divider.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.clock_divider.next; + load_next_c = '1; + field_combo.global_cfg.capability.clock_divider.next = next_c; + field_combo.global_cfg.capability.clock_divider.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.clock_divider.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.clock_divider.load_next) begin + field_storage.global_cfg.capability.clock_divider.value <= field_combo.global_cfg.capability.clock_divider.next; + end + end + end + assign hwif_out.global_cfg.capability.clock_divider.value = field_storage.global_cfg.capability.clock_divider.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.staged_apply + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.staged_apply.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.staged_apply.next; + load_next_c = '1; + field_combo.global_cfg.capability.staged_apply.next = next_c; + field_combo.global_cfg.capability.staged_apply.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.staged_apply.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.staged_apply.load_next) begin + field_storage.global_cfg.capability.staged_apply.value <= field_combo.global_cfg.capability.staged_apply.next; + end + end + end + assign hwif_out.global_cfg.capability.staged_apply.value = field_storage.global_cfg.capability.staged_apply.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.error_status + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.error_status.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.error_status.next; + load_next_c = '1; + field_combo.global_cfg.capability.error_status.next = next_c; + field_combo.global_cfg.capability.error_status.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.error_status.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.error_status.load_next) begin + field_storage.global_cfg.capability.error_status.value <= field_combo.global_cfg.capability.error_status.next; + end + end + end + assign hwif_out.global_cfg.capability.error_status.value = field_storage.global_cfg.capability.error_status.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.rwds_sample_timing + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.rwds_sample_timing.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.rwds_sample_timing.next; + load_next_c = '1; + field_combo.global_cfg.capability.rwds_sample_timing.next = next_c; + field_combo.global_cfg.capability.rwds_sample_timing.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.rwds_sample_timing.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.rwds_sample_timing.load_next) begin + field_storage.global_cfg.capability.rwds_sample_timing.value <= field_combo.global_cfg.capability.rwds_sample_timing.next; + end + end + end + assign hwif_out.global_cfg.capability.rwds_sample_timing.value = field_storage.global_cfg.capability.rwds_sample_timing.value; + // Field: hyperbus_cfg_regs.global_cfg.capability.rwds_oe_timing + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.capability.rwds_oe_timing.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.capability.rwds_oe_timing.next; + load_next_c = '1; + field_combo.global_cfg.capability.rwds_oe_timing.next = next_c; + field_combo.global_cfg.capability.rwds_oe_timing.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.capability.rwds_oe_timing.value <= 1'h0; + end else begin + if(field_combo.global_cfg.capability.rwds_oe_timing.load_next) begin + field_storage.global_cfg.capability.rwds_oe_timing.value <= field_combo.global_cfg.capability.rwds_oe_timing.next; + end + end + end + assign hwif_out.global_cfg.capability.rwds_oe_timing.value = field_storage.global_cfg.capability.rwds_oe_timing.value; + // Field: hyperbus_cfg_regs.global_cfg.command.flush + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.command.flush.value; + load_next_c = '0; + if(decoded_reg_strb.global_cfg.command && decoded_req_is_wr) begin // SW write + next_c = (field_storage.global_cfg.command.flush.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.global_cfg.command.flush.next = next_c; + field_combo.global_cfg.command.flush.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.command.flush.value <= 1'h0; + end else begin + if(field_combo.global_cfg.command.flush.load_next) begin + field_storage.global_cfg.command.flush.value <= field_combo.global_cfg.command.flush.next; + end + end + end + assign hwif_out.global_cfg.command.flush.value = field_storage.global_cfg.command.flush.value; + // Field: hyperbus_cfg_regs.global_cfg.command.apply + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.command.apply.value; + load_next_c = '0; + if(decoded_reg_strb.global_cfg.command && decoded_req_is_wr) begin // SW write + next_c = (field_storage.global_cfg.command.apply.value & ~decoded_wr_biten[1:1]) | (decoded_wr_data[1:1] & decoded_wr_biten[1:1]); + load_next_c = '1; + end else begin // singlepulse clears back to 0 + next_c = '0; + load_next_c = '1; + end + field_combo.global_cfg.command.apply.next = next_c; + field_combo.global_cfg.command.apply.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.command.apply.value <= 1'h0; + end else begin + if(field_combo.global_cfg.command.apply.load_next) begin + field_storage.global_cfg.command.apply.value <= field_combo.global_cfg.command.apply.next; + end + end + end + assign hwif_out.global_cfg.command.apply.value = field_storage.global_cfg.command.apply.value; + // Field: hyperbus_cfg_regs.global_cfg.status.decode_error + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.status.decode_error.value; + load_next_c = '0; + if(hwif_in.global_cfg.status.decode_error.hwset) begin // HW Set + next_c = '1; + load_next_c = '1; + end else if(decoded_reg_strb.global_cfg.status && decoded_req_is_wr) begin // SW write 1 clear + next_c = field_storage.global_cfg.status.decode_error.value & ~(decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end else begin // HW Write + next_c = hwif_in.global_cfg.status.decode_error.next; + load_next_c = '1; + end + field_combo.global_cfg.status.decode_error.next = next_c; + field_combo.global_cfg.status.decode_error.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.status.decode_error.value <= 1'h0; + end else begin + if(field_combo.global_cfg.status.decode_error.load_next) begin + field_storage.global_cfg.status.decode_error.value <= field_combo.global_cfg.status.decode_error.next; + end + end + end + assign hwif_out.global_cfg.status.decode_error.value = field_storage.global_cfg.status.decode_error.value; + // Field: hyperbus_cfg_regs.global_cfg.status.busy + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.status.busy.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.status.busy.next; + load_next_c = '1; + field_combo.global_cfg.status.busy.next = next_c; + field_combo.global_cfg.status.busy.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.status.busy.value <= 1'h0; + end else begin + if(field_combo.global_cfg.status.busy.load_next) begin + field_storage.global_cfg.status.busy.value <= field_combo.global_cfg.status.busy.next; + end + end + end + assign hwif_out.global_cfg.status.busy.value = field_storage.global_cfg.status.busy.value; + // Field: hyperbus_cfg_regs.global_cfg.status.dirty + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.global_cfg.status.dirty.value; + load_next_c = '0; + + // HW Write + next_c = hwif_in.global_cfg.status.dirty.next; + load_next_c = '1; + field_combo.global_cfg.status.dirty.next = next_c; + field_combo.global_cfg.status.dirty.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.global_cfg.status.dirty.value <= 1'h0; + end else begin + if(field_combo.global_cfg.status.dirty.load_next) begin + field_storage.global_cfg.status.dirty.value <= field_combo.global_cfg.status.dirty.next; + end + end + end + assign hwif_out.global_cfg.status.dirty.value = field_storage.global_cfg.status.dirty.value; + // Field: hyperbus_cfg_regs.frontend.frontend_cfg.dual_phy + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.frontend.frontend_cfg.dual_phy.value; + load_next_c = '0; + if(decoded_reg_strb.frontend.frontend_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.frontend.frontend_cfg.dual_phy.value & ~decoded_wr_biten[0:0]) | (decoded_wr_data[0:0] & decoded_wr_biten[0:0]); + load_next_c = '1; + end + field_combo.frontend.frontend_cfg.dual_phy.next = next_c; + field_combo.frontend.frontend_cfg.dual_phy.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.frontend.frontend_cfg.dual_phy.value <= 1'h1; + end else begin + if(field_combo.frontend.frontend_cfg.dual_phy.load_next) begin + field_storage.frontend.frontend_cfg.dual_phy.value <= field_combo.frontend.frontend_cfg.dual_phy.next; + end + end + end + assign hwif_out.frontend.frontend_cfg.dual_phy.value = field_storage.frontend.frontend_cfg.dual_phy.value; + // Field: hyperbus_cfg_regs.backend.clock_cfg.divider + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.backend.clock_cfg.divider.value; + load_next_c = '0; + if(decoded_reg_strb.backend.clock_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.backend.clock_cfg.divider.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.backend.clock_cfg.divider.next = next_c; + field_combo.backend.clock_cfg.divider.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.backend.clock_cfg.divider.value <= 8'h8; + end else begin + if(field_combo.backend.clock_cfg.divider.load_next) begin + field_storage.backend.clock_cfg.divider.value <= field_combo.backend.clock_cfg.divider.next; + end + end + end + assign hwif_out.backend.clock_cfg.divider.value = field_storage.backend.clock_cfg.divider.value; + // Field: hyperbus_cfg_regs.phy_0.tx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.phy_0.tx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.phy_0.tx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.phy_0.tx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.phy_0.tx_delay.value.next = next_c; + field_combo.phy_0.tx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.phy_0.tx_delay.value.value <= 8'h10; + end else begin + if(field_combo.phy_0.tx_delay.value.load_next) begin + field_storage.phy_0.tx_delay.value.value <= field_combo.phy_0.tx_delay.value.next; + end + end + end + assign hwif_out.phy_0.tx_delay.value.value = field_storage.phy_0.tx_delay.value.value; + // Field: hyperbus_cfg_regs.phy_0.rwds_timing.rwds_oe_setup_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.phy_0.rwds_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.phy_0.rwds_timing.rwds_oe_setup_cycles.next = next_c; + field_combo.phy_0.rwds_timing.rwds_oe_setup_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value <= 8'h1; + end else begin + if(field_combo.phy_0.rwds_timing.rwds_oe_setup_cycles.load_next) begin + field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value <= field_combo.phy_0.rwds_timing.rwds_oe_setup_cycles.next; + end + end + end + assign hwif_out.phy_0.rwds_timing.rwds_oe_setup_cycles.value = field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value; + // Field: hyperbus_cfg_regs.phy_1.tx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.phy_1.tx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.phy_1.tx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.phy_1.tx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.phy_1.tx_delay.value.next = next_c; + field_combo.phy_1.tx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.phy_1.tx_delay.value.value <= 8'h10; + end else begin + if(field_combo.phy_1.tx_delay.value.load_next) begin + field_storage.phy_1.tx_delay.value.value <= field_combo.phy_1.tx_delay.value.next; + end + end + end + assign hwif_out.phy_1.tx_delay.value.value = field_storage.phy_1.tx_delay.value.value; + // Field: hyperbus_cfg_regs.phy_1.rwds_timing.rwds_oe_setup_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.phy_1.rwds_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.phy_1.rwds_timing.rwds_oe_setup_cycles.next = next_c; + field_combo.phy_1.rwds_timing.rwds_oe_setup_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value <= 8'h1; + end else begin + if(field_combo.phy_1.rwds_timing.rwds_oe_setup_cycles.load_next) begin + field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value <= field_combo.phy_1.rwds_timing.rwds_oe_setup_cycles.next; + end + end + end + assign hwif_out.phy_1.rwds_timing.rwds_oe_setup_cycles.value = field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value; + // Field: hyperbus_cfg_regs.chip_0.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_0.range_base.value.next = next_c; + field_combo.chip_0.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.range_base.value.value <= 10'h0; + end else begin + if(field_combo.chip_0.range_base.value.load_next) begin + field_storage.chip_0.range_base.value.value <= field_combo.chip_0.range_base.value.next; + end + end + end + assign hwif_out.chip_0.range_base.value.value = field_storage.chip_0.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_0.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_0.range_bound.value.next = next_c; + field_combo.chip_0.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.range_bound.value.value <= 10'h1; + end else begin + if(field_combo.chip_0.range_bound.value.load_next) begin + field_storage.chip_0.range_bound.value.value <= field_combo.chip_0.range_bound.value.next; + end + end + end + assign hwif_out.chip_0.range_bound.value.value = field_storage.chip_0.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_0.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_0.address_cfg.address_space.next = next_c; + field_combo.chip_0.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_0.address_cfg.address_space.load_next) begin + field_storage.chip_0.address_cfg.address_space.value <= field_combo.chip_0.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_0.address_cfg.address_space.value = field_storage.chip_0.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_0.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_0.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_0.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_0.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_0.address_cfg.address_mask_msb.value <= field_combo.chip_0.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_0.address_cfg.address_mask_msb.value = field_storage.chip_0.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_0.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_0.address_cfg.enable.next = next_c; + field_combo.chip_0.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_0.address_cfg.enable.load_next) begin + field_storage.chip_0.address_cfg.enable.value <= field_combo.chip_0.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_0.address_cfg.enable.value = field_storage.chip_0.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_0.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_0.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_0.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_0.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_0.latency_cfg.t_latency_access.value <= field_combo.chip_0.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_0.latency_cfg.t_latency_access.value = field_storage.chip_0.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_0.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_0.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_0.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_0.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_0.latency_cfg.rwds_sample_delay.value <= field_combo.chip_0.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_0.latency_cfg.rwds_sample_delay.value = field_storage.chip_0.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_0.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_0.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_0.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_0.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_0.latency_cfg.en_latency_additional.value <= field_combo.chip_0.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_0.latency_cfg.en_latency_additional.value = field_storage.chip_0.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_0.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_0.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_0.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_0.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_0.burst_cfg.t_burst_max.value <= field_combo.chip_0.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_0.burst_cfg.t_burst_max.value = field_storage.chip_0.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_0.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_0.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_0.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_0.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_0.chip_timing.t_read_write_recovery.value <= field_combo.chip_0.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_0.chip_timing.t_read_write_recovery.value = field_storage.chip_0.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_0.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_0.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_0.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_0.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_0.chip_timing.t_csh_cycles.value <= field_combo.chip_0.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_0.chip_timing.t_csh_cycles.value = field_storage.chip_0.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_0.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_0.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_0.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_0.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_0.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_0.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_0.chip_timing.csn_to_ck_cycles.value = field_storage.chip_0.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_0.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_0.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_0.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_0.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_0.rx_delay.value.next = next_c; + field_combo.chip_0.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_0.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_0.rx_delay.value.load_next) begin + field_storage.chip_0.rx_delay.value.value <= field_combo.chip_0.rx_delay.value.next; + end + end + end + assign hwif_out.chip_0.rx_delay.value.value = field_storage.chip_0.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_1.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_1.range_base.value.next = next_c; + field_combo.chip_1.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.range_base.value.value <= 10'h1; + end else begin + if(field_combo.chip_1.range_base.value.load_next) begin + field_storage.chip_1.range_base.value.value <= field_combo.chip_1.range_base.value.next; + end + end + end + assign hwif_out.chip_1.range_base.value.value = field_storage.chip_1.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_1.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_1.range_bound.value.next = next_c; + field_combo.chip_1.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.range_bound.value.value <= 10'h2; + end else begin + if(field_combo.chip_1.range_bound.value.load_next) begin + field_storage.chip_1.range_bound.value.value <= field_combo.chip_1.range_bound.value.next; + end + end + end + assign hwif_out.chip_1.range_bound.value.value = field_storage.chip_1.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_1.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_1.address_cfg.address_space.next = next_c; + field_combo.chip_1.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_1.address_cfg.address_space.load_next) begin + field_storage.chip_1.address_cfg.address_space.value <= field_combo.chip_1.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_1.address_cfg.address_space.value = field_storage.chip_1.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_1.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_1.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_1.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_1.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_1.address_cfg.address_mask_msb.value <= field_combo.chip_1.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_1.address_cfg.address_mask_msb.value = field_storage.chip_1.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_1.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_1.address_cfg.enable.next = next_c; + field_combo.chip_1.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_1.address_cfg.enable.load_next) begin + field_storage.chip_1.address_cfg.enable.value <= field_combo.chip_1.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_1.address_cfg.enable.value = field_storage.chip_1.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_1.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_1.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_1.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_1.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_1.latency_cfg.t_latency_access.value <= field_combo.chip_1.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_1.latency_cfg.t_latency_access.value = field_storage.chip_1.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_1.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_1.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_1.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_1.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_1.latency_cfg.rwds_sample_delay.value <= field_combo.chip_1.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_1.latency_cfg.rwds_sample_delay.value = field_storage.chip_1.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_1.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_1.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_1.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_1.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_1.latency_cfg.en_latency_additional.value <= field_combo.chip_1.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_1.latency_cfg.en_latency_additional.value = field_storage.chip_1.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_1.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_1.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_1.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_1.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_1.burst_cfg.t_burst_max.value <= field_combo.chip_1.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_1.burst_cfg.t_burst_max.value = field_storage.chip_1.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_1.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_1.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_1.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_1.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_1.chip_timing.t_read_write_recovery.value <= field_combo.chip_1.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_1.chip_timing.t_read_write_recovery.value = field_storage.chip_1.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_1.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_1.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_1.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_1.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_1.chip_timing.t_csh_cycles.value <= field_combo.chip_1.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_1.chip_timing.t_csh_cycles.value = field_storage.chip_1.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_1.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_1.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_1.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_1.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_1.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_1.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_1.chip_timing.csn_to_ck_cycles.value = field_storage.chip_1.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_1.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_1.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_1.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_1.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_1.rx_delay.value.next = next_c; + field_combo.chip_1.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_1.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_1.rx_delay.value.load_next) begin + field_storage.chip_1.rx_delay.value.value <= field_combo.chip_1.rx_delay.value.next; + end + end + end + assign hwif_out.chip_1.rx_delay.value.value = field_storage.chip_1.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_2.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_2.range_base.value.next = next_c; + field_combo.chip_2.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.range_base.value.value <= 10'h2; + end else begin + if(field_combo.chip_2.range_base.value.load_next) begin + field_storage.chip_2.range_base.value.value <= field_combo.chip_2.range_base.value.next; + end + end + end + assign hwif_out.chip_2.range_base.value.value = field_storage.chip_2.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_2.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_2.range_bound.value.next = next_c; + field_combo.chip_2.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.range_bound.value.value <= 10'h3; + end else begin + if(field_combo.chip_2.range_bound.value.load_next) begin + field_storage.chip_2.range_bound.value.value <= field_combo.chip_2.range_bound.value.next; + end + end + end + assign hwif_out.chip_2.range_bound.value.value = field_storage.chip_2.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_2.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_2.address_cfg.address_space.next = next_c; + field_combo.chip_2.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_2.address_cfg.address_space.load_next) begin + field_storage.chip_2.address_cfg.address_space.value <= field_combo.chip_2.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_2.address_cfg.address_space.value = field_storage.chip_2.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_2.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_2.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_2.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_2.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_2.address_cfg.address_mask_msb.value <= field_combo.chip_2.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_2.address_cfg.address_mask_msb.value = field_storage.chip_2.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_2.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_2.address_cfg.enable.next = next_c; + field_combo.chip_2.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_2.address_cfg.enable.load_next) begin + field_storage.chip_2.address_cfg.enable.value <= field_combo.chip_2.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_2.address_cfg.enable.value = field_storage.chip_2.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_2.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_2.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_2.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_2.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_2.latency_cfg.t_latency_access.value <= field_combo.chip_2.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_2.latency_cfg.t_latency_access.value = field_storage.chip_2.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_2.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_2.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_2.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_2.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_2.latency_cfg.rwds_sample_delay.value <= field_combo.chip_2.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_2.latency_cfg.rwds_sample_delay.value = field_storage.chip_2.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_2.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_2.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_2.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_2.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_2.latency_cfg.en_latency_additional.value <= field_combo.chip_2.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_2.latency_cfg.en_latency_additional.value = field_storage.chip_2.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_2.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_2.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_2.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_2.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_2.burst_cfg.t_burst_max.value <= field_combo.chip_2.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_2.burst_cfg.t_burst_max.value = field_storage.chip_2.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_2.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_2.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_2.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_2.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_2.chip_timing.t_read_write_recovery.value <= field_combo.chip_2.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_2.chip_timing.t_read_write_recovery.value = field_storage.chip_2.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_2.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_2.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_2.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_2.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_2.chip_timing.t_csh_cycles.value <= field_combo.chip_2.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_2.chip_timing.t_csh_cycles.value = field_storage.chip_2.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_2.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_2.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_2.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_2.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_2.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_2.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_2.chip_timing.csn_to_ck_cycles.value = field_storage.chip_2.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_2.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_2.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_2.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_2.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_2.rx_delay.value.next = next_c; + field_combo.chip_2.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_2.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_2.rx_delay.value.load_next) begin + field_storage.chip_2.rx_delay.value.value <= field_combo.chip_2.rx_delay.value.next; + end + end + end + assign hwif_out.chip_2.rx_delay.value.value = field_storage.chip_2.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_3.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_3.range_base.value.next = next_c; + field_combo.chip_3.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.range_base.value.value <= 10'h3; + end else begin + if(field_combo.chip_3.range_base.value.load_next) begin + field_storage.chip_3.range_base.value.value <= field_combo.chip_3.range_base.value.next; + end + end + end + assign hwif_out.chip_3.range_base.value.value = field_storage.chip_3.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_3.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_3.range_bound.value.next = next_c; + field_combo.chip_3.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.range_bound.value.value <= 10'h4; + end else begin + if(field_combo.chip_3.range_bound.value.load_next) begin + field_storage.chip_3.range_bound.value.value <= field_combo.chip_3.range_bound.value.next; + end + end + end + assign hwif_out.chip_3.range_bound.value.value = field_storage.chip_3.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_3.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_3.address_cfg.address_space.next = next_c; + field_combo.chip_3.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_3.address_cfg.address_space.load_next) begin + field_storage.chip_3.address_cfg.address_space.value <= field_combo.chip_3.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_3.address_cfg.address_space.value = field_storage.chip_3.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_3.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_3.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_3.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_3.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_3.address_cfg.address_mask_msb.value <= field_combo.chip_3.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_3.address_cfg.address_mask_msb.value = field_storage.chip_3.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_3.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_3.address_cfg.enable.next = next_c; + field_combo.chip_3.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_3.address_cfg.enable.load_next) begin + field_storage.chip_3.address_cfg.enable.value <= field_combo.chip_3.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_3.address_cfg.enable.value = field_storage.chip_3.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_3.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_3.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_3.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_3.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_3.latency_cfg.t_latency_access.value <= field_combo.chip_3.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_3.latency_cfg.t_latency_access.value = field_storage.chip_3.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_3.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_3.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_3.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_3.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_3.latency_cfg.rwds_sample_delay.value <= field_combo.chip_3.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_3.latency_cfg.rwds_sample_delay.value = field_storage.chip_3.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_3.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_3.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_3.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_3.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_3.latency_cfg.en_latency_additional.value <= field_combo.chip_3.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_3.latency_cfg.en_latency_additional.value = field_storage.chip_3.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_3.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_3.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_3.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_3.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_3.burst_cfg.t_burst_max.value <= field_combo.chip_3.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_3.burst_cfg.t_burst_max.value = field_storage.chip_3.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_3.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_3.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_3.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_3.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_3.chip_timing.t_read_write_recovery.value <= field_combo.chip_3.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_3.chip_timing.t_read_write_recovery.value = field_storage.chip_3.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_3.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_3.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_3.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_3.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_3.chip_timing.t_csh_cycles.value <= field_combo.chip_3.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_3.chip_timing.t_csh_cycles.value = field_storage.chip_3.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_3.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_3.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_3.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_3.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_3.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_3.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_3.chip_timing.csn_to_ck_cycles.value = field_storage.chip_3.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_3.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_3.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_3.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_3.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_3.rx_delay.value.next = next_c; + field_combo.chip_3.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_3.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_3.rx_delay.value.load_next) begin + field_storage.chip_3.rx_delay.value.value <= field_combo.chip_3.rx_delay.value.next; + end + end + end + assign hwif_out.chip_3.rx_delay.value.value = field_storage.chip_3.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_4.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_4.range_base.value.next = next_c; + field_combo.chip_4.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.range_base.value.value <= 10'h4; + end else begin + if(field_combo.chip_4.range_base.value.load_next) begin + field_storage.chip_4.range_base.value.value <= field_combo.chip_4.range_base.value.next; + end + end + end + assign hwif_out.chip_4.range_base.value.value = field_storage.chip_4.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_4.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_4.range_bound.value.next = next_c; + field_combo.chip_4.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.range_bound.value.value <= 10'h5; + end else begin + if(field_combo.chip_4.range_bound.value.load_next) begin + field_storage.chip_4.range_bound.value.value <= field_combo.chip_4.range_bound.value.next; + end + end + end + assign hwif_out.chip_4.range_bound.value.value = field_storage.chip_4.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_4.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_4.address_cfg.address_space.next = next_c; + field_combo.chip_4.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_4.address_cfg.address_space.load_next) begin + field_storage.chip_4.address_cfg.address_space.value <= field_combo.chip_4.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_4.address_cfg.address_space.value = field_storage.chip_4.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_4.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_4.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_4.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_4.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_4.address_cfg.address_mask_msb.value <= field_combo.chip_4.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_4.address_cfg.address_mask_msb.value = field_storage.chip_4.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_4.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_4.address_cfg.enable.next = next_c; + field_combo.chip_4.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_4.address_cfg.enable.load_next) begin + field_storage.chip_4.address_cfg.enable.value <= field_combo.chip_4.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_4.address_cfg.enable.value = field_storage.chip_4.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_4.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_4.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_4.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_4.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_4.latency_cfg.t_latency_access.value <= field_combo.chip_4.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_4.latency_cfg.t_latency_access.value = field_storage.chip_4.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_4.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_4.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_4.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_4.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_4.latency_cfg.rwds_sample_delay.value <= field_combo.chip_4.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_4.latency_cfg.rwds_sample_delay.value = field_storage.chip_4.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_4.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_4.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_4.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_4.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_4.latency_cfg.en_latency_additional.value <= field_combo.chip_4.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_4.latency_cfg.en_latency_additional.value = field_storage.chip_4.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_4.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_4.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_4.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_4.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_4.burst_cfg.t_burst_max.value <= field_combo.chip_4.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_4.burst_cfg.t_burst_max.value = field_storage.chip_4.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_4.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_4.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_4.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_4.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_4.chip_timing.t_read_write_recovery.value <= field_combo.chip_4.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_4.chip_timing.t_read_write_recovery.value = field_storage.chip_4.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_4.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_4.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_4.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_4.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_4.chip_timing.t_csh_cycles.value <= field_combo.chip_4.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_4.chip_timing.t_csh_cycles.value = field_storage.chip_4.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_4.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_4.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_4.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_4.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_4.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_4.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_4.chip_timing.csn_to_ck_cycles.value = field_storage.chip_4.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_4.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_4.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_4.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_4.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_4.rx_delay.value.next = next_c; + field_combo.chip_4.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_4.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_4.rx_delay.value.load_next) begin + field_storage.chip_4.rx_delay.value.value <= field_combo.chip_4.rx_delay.value.next; + end + end + end + assign hwif_out.chip_4.rx_delay.value.value = field_storage.chip_4.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_5.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_5.range_base.value.next = next_c; + field_combo.chip_5.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.range_base.value.value <= 10'h5; + end else begin + if(field_combo.chip_5.range_base.value.load_next) begin + field_storage.chip_5.range_base.value.value <= field_combo.chip_5.range_base.value.next; + end + end + end + assign hwif_out.chip_5.range_base.value.value = field_storage.chip_5.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_5.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_5.range_bound.value.next = next_c; + field_combo.chip_5.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.range_bound.value.value <= 10'h6; + end else begin + if(field_combo.chip_5.range_bound.value.load_next) begin + field_storage.chip_5.range_bound.value.value <= field_combo.chip_5.range_bound.value.next; + end + end + end + assign hwif_out.chip_5.range_bound.value.value = field_storage.chip_5.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_5.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_5.address_cfg.address_space.next = next_c; + field_combo.chip_5.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_5.address_cfg.address_space.load_next) begin + field_storage.chip_5.address_cfg.address_space.value <= field_combo.chip_5.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_5.address_cfg.address_space.value = field_storage.chip_5.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_5.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_5.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_5.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_5.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_5.address_cfg.address_mask_msb.value <= field_combo.chip_5.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_5.address_cfg.address_mask_msb.value = field_storage.chip_5.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_5.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_5.address_cfg.enable.next = next_c; + field_combo.chip_5.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_5.address_cfg.enable.load_next) begin + field_storage.chip_5.address_cfg.enable.value <= field_combo.chip_5.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_5.address_cfg.enable.value = field_storage.chip_5.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_5.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_5.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_5.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_5.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_5.latency_cfg.t_latency_access.value <= field_combo.chip_5.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_5.latency_cfg.t_latency_access.value = field_storage.chip_5.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_5.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_5.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_5.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_5.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_5.latency_cfg.rwds_sample_delay.value <= field_combo.chip_5.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_5.latency_cfg.rwds_sample_delay.value = field_storage.chip_5.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_5.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_5.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_5.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_5.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_5.latency_cfg.en_latency_additional.value <= field_combo.chip_5.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_5.latency_cfg.en_latency_additional.value = field_storage.chip_5.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_5.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_5.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_5.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_5.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_5.burst_cfg.t_burst_max.value <= field_combo.chip_5.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_5.burst_cfg.t_burst_max.value = field_storage.chip_5.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_5.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_5.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_5.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_5.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_5.chip_timing.t_read_write_recovery.value <= field_combo.chip_5.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_5.chip_timing.t_read_write_recovery.value = field_storage.chip_5.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_5.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_5.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_5.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_5.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_5.chip_timing.t_csh_cycles.value <= field_combo.chip_5.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_5.chip_timing.t_csh_cycles.value = field_storage.chip_5.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_5.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_5.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_5.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_5.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_5.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_5.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_5.chip_timing.csn_to_ck_cycles.value = field_storage.chip_5.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_5.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_5.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_5.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_5.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_5.rx_delay.value.next = next_c; + field_combo.chip_5.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_5.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_5.rx_delay.value.load_next) begin + field_storage.chip_5.rx_delay.value.value <= field_combo.chip_5.rx_delay.value.next; + end + end + end + assign hwif_out.chip_5.rx_delay.value.value = field_storage.chip_5.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_6.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_6.range_base.value.next = next_c; + field_combo.chip_6.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.range_base.value.value <= 10'h6; + end else begin + if(field_combo.chip_6.range_base.value.load_next) begin + field_storage.chip_6.range_base.value.value <= field_combo.chip_6.range_base.value.next; + end + end + end + assign hwif_out.chip_6.range_base.value.value = field_storage.chip_6.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_6.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_6.range_bound.value.next = next_c; + field_combo.chip_6.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.range_bound.value.value <= 10'h7; + end else begin + if(field_combo.chip_6.range_bound.value.load_next) begin + field_storage.chip_6.range_bound.value.value <= field_combo.chip_6.range_bound.value.next; + end + end + end + assign hwif_out.chip_6.range_bound.value.value = field_storage.chip_6.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_6.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_6.address_cfg.address_space.next = next_c; + field_combo.chip_6.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_6.address_cfg.address_space.load_next) begin + field_storage.chip_6.address_cfg.address_space.value <= field_combo.chip_6.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_6.address_cfg.address_space.value = field_storage.chip_6.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_6.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_6.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_6.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_6.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_6.address_cfg.address_mask_msb.value <= field_combo.chip_6.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_6.address_cfg.address_mask_msb.value = field_storage.chip_6.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_6.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_6.address_cfg.enable.next = next_c; + field_combo.chip_6.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_6.address_cfg.enable.load_next) begin + field_storage.chip_6.address_cfg.enable.value <= field_combo.chip_6.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_6.address_cfg.enable.value = field_storage.chip_6.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_6.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_6.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_6.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_6.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_6.latency_cfg.t_latency_access.value <= field_combo.chip_6.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_6.latency_cfg.t_latency_access.value = field_storage.chip_6.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_6.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_6.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_6.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_6.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_6.latency_cfg.rwds_sample_delay.value <= field_combo.chip_6.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_6.latency_cfg.rwds_sample_delay.value = field_storage.chip_6.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_6.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_6.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_6.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_6.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_6.latency_cfg.en_latency_additional.value <= field_combo.chip_6.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_6.latency_cfg.en_latency_additional.value = field_storage.chip_6.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_6.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_6.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_6.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_6.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_6.burst_cfg.t_burst_max.value <= field_combo.chip_6.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_6.burst_cfg.t_burst_max.value = field_storage.chip_6.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_6.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_6.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_6.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_6.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_6.chip_timing.t_read_write_recovery.value <= field_combo.chip_6.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_6.chip_timing.t_read_write_recovery.value = field_storage.chip_6.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_6.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_6.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_6.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_6.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_6.chip_timing.t_csh_cycles.value <= field_combo.chip_6.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_6.chip_timing.t_csh_cycles.value = field_storage.chip_6.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_6.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_6.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_6.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_6.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_6.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_6.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_6.chip_timing.csn_to_ck_cycles.value = field_storage.chip_6.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_6.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_6.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_6.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_6.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_6.rx_delay.value.next = next_c; + field_combo.chip_6.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_6.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_6.rx_delay.value.load_next) begin + field_storage.chip_6.rx_delay.value.value <= field_combo.chip_6.rx_delay.value.next; + end + end + end + assign hwif_out.chip_6.rx_delay.value.value = field_storage.chip_6.rx_delay.value.value; + // Field: hyperbus_cfg_regs.chip_7.range_base.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.range_base.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.range_base && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.range_base.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_7.range_base.value.next = next_c; + field_combo.chip_7.range_base.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.range_base.value.value <= 10'h7; + end else begin + if(field_combo.chip_7.range_base.value.load_next) begin + field_storage.chip_7.range_base.value.value <= field_combo.chip_7.range_base.value.next; + end + end + end + assign hwif_out.chip_7.range_base.value.value = field_storage.chip_7.range_base.value.value; + // Field: hyperbus_cfg_regs.chip_7.range_bound.value + always_comb begin + automatic logic [9:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.range_bound.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.range_bound && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.range_bound.value.value & ~decoded_wr_biten[31:22]) | (decoded_wr_data[31:22] & decoded_wr_biten[31:22]); + load_next_c = '1; + end + field_combo.chip_7.range_bound.value.next = next_c; + field_combo.chip_7.range_bound.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.range_bound.value.value <= 10'h8; + end else begin + if(field_combo.chip_7.range_bound.value.load_next) begin + field_storage.chip_7.range_bound.value.value <= field_combo.chip_7.range_bound.value.next; + end + end + end + assign hwif_out.chip_7.range_bound.value.value = field_storage.chip_7.range_bound.value.value; + // Field: hyperbus_cfg_regs.chip_7.address_cfg.address_space + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.address_cfg.address_space.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.address_cfg.address_space.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_7.address_cfg.address_space.next = next_c; + field_combo.chip_7.address_cfg.address_space.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.address_cfg.address_space.value <= 8'h0; + end else begin + if(field_combo.chip_7.address_cfg.address_space.load_next) begin + field_storage.chip_7.address_cfg.address_space.value <= field_combo.chip_7.address_cfg.address_space.next; + end + end + end + assign hwif_out.chip_7.address_cfg.address_space.value = field_storage.chip_7.address_cfg.address_space.value; + // Field: hyperbus_cfg_regs.chip_7.address_cfg.address_mask_msb + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.address_cfg.address_mask_msb.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.address_cfg.address_mask_msb.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_7.address_cfg.address_mask_msb.next = next_c; + field_combo.chip_7.address_cfg.address_mask_msb.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.address_cfg.address_mask_msb.value <= 8'h19; + end else begin + if(field_combo.chip_7.address_cfg.address_mask_msb.load_next) begin + field_storage.chip_7.address_cfg.address_mask_msb.value <= field_combo.chip_7.address_cfg.address_mask_msb.next; + end + end + end + assign hwif_out.chip_7.address_cfg.address_mask_msb.value = field_storage.chip_7.address_cfg.address_mask_msb.value; + // Field: hyperbus_cfg_regs.chip_7.address_cfg.enable + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.address_cfg.enable.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.address_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.address_cfg.enable.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_7.address_cfg.enable.next = next_c; + field_combo.chip_7.address_cfg.enable.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.address_cfg.enable.value <= 1'h1; + end else begin + if(field_combo.chip_7.address_cfg.enable.load_next) begin + field_storage.chip_7.address_cfg.enable.value <= field_combo.chip_7.address_cfg.enable.next; + end + end + end + assign hwif_out.chip_7.address_cfg.enable.value = field_storage.chip_7.address_cfg.enable.value; + // Field: hyperbus_cfg_regs.chip_7.latency_cfg.t_latency_access + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.latency_cfg.t_latency_access.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.latency_cfg.t_latency_access.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_7.latency_cfg.t_latency_access.next = next_c; + field_combo.chip_7.latency_cfg.t_latency_access.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.latency_cfg.t_latency_access.value <= 8'h6; + end else begin + if(field_combo.chip_7.latency_cfg.t_latency_access.load_next) begin + field_storage.chip_7.latency_cfg.t_latency_access.value <= field_combo.chip_7.latency_cfg.t_latency_access.next; + end + end + end + assign hwif_out.chip_7.latency_cfg.t_latency_access.value = field_storage.chip_7.latency_cfg.t_latency_access.value; + // Field: hyperbus_cfg_regs.chip_7.latency_cfg.rwds_sample_delay + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.latency_cfg.rwds_sample_delay.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.latency_cfg.rwds_sample_delay.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_7.latency_cfg.rwds_sample_delay.next = next_c; + field_combo.chip_7.latency_cfg.rwds_sample_delay.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.latency_cfg.rwds_sample_delay.value <= 8'h0; + end else begin + if(field_combo.chip_7.latency_cfg.rwds_sample_delay.load_next) begin + field_storage.chip_7.latency_cfg.rwds_sample_delay.value <= field_combo.chip_7.latency_cfg.rwds_sample_delay.next; + end + end + end + assign hwif_out.chip_7.latency_cfg.rwds_sample_delay.value = field_storage.chip_7.latency_cfg.rwds_sample_delay.value; + // Field: hyperbus_cfg_regs.chip_7.latency_cfg.en_latency_additional + always_comb begin + automatic logic [0:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.latency_cfg.en_latency_additional.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.latency_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.latency_cfg.en_latency_additional.value & ~decoded_wr_biten[16:16]) | (decoded_wr_data[16:16] & decoded_wr_biten[16:16]); + load_next_c = '1; + end + field_combo.chip_7.latency_cfg.en_latency_additional.next = next_c; + field_combo.chip_7.latency_cfg.en_latency_additional.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.latency_cfg.en_latency_additional.value <= 1'h0; + end else begin + if(field_combo.chip_7.latency_cfg.en_latency_additional.load_next) begin + field_storage.chip_7.latency_cfg.en_latency_additional.value <= field_combo.chip_7.latency_cfg.en_latency_additional.next; + end + end + end + assign hwif_out.chip_7.latency_cfg.en_latency_additional.value = field_storage.chip_7.latency_cfg.en_latency_additional.value; + // Field: hyperbus_cfg_regs.chip_7.burst_cfg.t_burst_max + always_comb begin + automatic logic [15:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.burst_cfg.t_burst_max.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.burst_cfg && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.burst_cfg.t_burst_max.value & ~decoded_wr_biten[15:0]) | (decoded_wr_data[15:0] & decoded_wr_biten[15:0]); + load_next_c = '1; + end + field_combo.chip_7.burst_cfg.t_burst_max.next = next_c; + field_combo.chip_7.burst_cfg.t_burst_max.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.burst_cfg.t_burst_max.value <= 16'h15e; + end else begin + if(field_combo.chip_7.burst_cfg.t_burst_max.load_next) begin + field_storage.chip_7.burst_cfg.t_burst_max.value <= field_combo.chip_7.burst_cfg.t_burst_max.next; + end + end + end + assign hwif_out.chip_7.burst_cfg.t_burst_max.value = field_storage.chip_7.burst_cfg.t_burst_max.value; + // Field: hyperbus_cfg_regs.chip_7.chip_timing.t_read_write_recovery + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.chip_timing.t_read_write_recovery.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.chip_timing.t_read_write_recovery.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_7.chip_timing.t_read_write_recovery.next = next_c; + field_combo.chip_7.chip_timing.t_read_write_recovery.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.chip_timing.t_read_write_recovery.value <= 8'h6; + end else begin + if(field_combo.chip_7.chip_timing.t_read_write_recovery.load_next) begin + field_storage.chip_7.chip_timing.t_read_write_recovery.value <= field_combo.chip_7.chip_timing.t_read_write_recovery.next; + end + end + end + assign hwif_out.chip_7.chip_timing.t_read_write_recovery.value = field_storage.chip_7.chip_timing.t_read_write_recovery.value; + // Field: hyperbus_cfg_regs.chip_7.chip_timing.t_csh_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.chip_timing.t_csh_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.chip_timing.t_csh_cycles.value & ~decoded_wr_biten[15:8]) | (decoded_wr_data[15:8] & decoded_wr_biten[15:8]); + load_next_c = '1; + end + field_combo.chip_7.chip_timing.t_csh_cycles.next = next_c; + field_combo.chip_7.chip_timing.t_csh_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.chip_timing.t_csh_cycles.value <= 8'h1; + end else begin + if(field_combo.chip_7.chip_timing.t_csh_cycles.load_next) begin + field_storage.chip_7.chip_timing.t_csh_cycles.value <= field_combo.chip_7.chip_timing.t_csh_cycles.next; + end + end + end + assign hwif_out.chip_7.chip_timing.t_csh_cycles.value = field_storage.chip_7.chip_timing.t_csh_cycles.value; + // Field: hyperbus_cfg_regs.chip_7.chip_timing.csn_to_ck_cycles + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.chip_timing.csn_to_ck_cycles.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.chip_timing && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.chip_timing.csn_to_ck_cycles.value & ~decoded_wr_biten[23:16]) | (decoded_wr_data[23:16] & decoded_wr_biten[23:16]); + load_next_c = '1; + end + field_combo.chip_7.chip_timing.csn_to_ck_cycles.next = next_c; + field_combo.chip_7.chip_timing.csn_to_ck_cycles.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.chip_timing.csn_to_ck_cycles.value <= 8'h0; + end else begin + if(field_combo.chip_7.chip_timing.csn_to_ck_cycles.load_next) begin + field_storage.chip_7.chip_timing.csn_to_ck_cycles.value <= field_combo.chip_7.chip_timing.csn_to_ck_cycles.next; + end + end + end + assign hwif_out.chip_7.chip_timing.csn_to_ck_cycles.value = field_storage.chip_7.chip_timing.csn_to_ck_cycles.value; + // Field: hyperbus_cfg_regs.chip_7.rx_delay.value + always_comb begin + automatic logic [7:0] next_c; + automatic logic load_next_c; + next_c = field_storage.chip_7.rx_delay.value.value; + load_next_c = '0; + if(decoded_reg_strb.chip_7.rx_delay && decoded_req_is_wr) begin // SW write + next_c = (field_storage.chip_7.rx_delay.value.value & ~decoded_wr_biten[7:0]) | (decoded_wr_data[7:0] & decoded_wr_biten[7:0]); + load_next_c = '1; + end + field_combo.chip_7.rx_delay.value.next = next_c; + field_combo.chip_7.rx_delay.value.load_next = load_next_c; + end + always_ff @(posedge clk or negedge arst_n) begin + if(~arst_n) begin + field_storage.chip_7.rx_delay.value.value <= 8'h10; + end else begin + if(field_combo.chip_7.rx_delay.value.load_next) begin + field_storage.chip_7.rx_delay.value.value <= field_combo.chip_7.rx_delay.value.next; + end + end + end + assign hwif_out.chip_7.rx_delay.value.value = field_storage.chip_7.rx_delay.value.value; + assign hwif_out.reserved_top.value.value = 32'h0; + + //-------------------------------------------------------------------------- + // Write response + //-------------------------------------------------------------------------- + assign cpuif_wr_ack = decoded_req & decoded_req_is_wr; + // Writes are always granted with no error response + assign cpuif_wr_err = '0; + + //-------------------------------------------------------------------------- + // Readback + //-------------------------------------------------------------------------- + + logic [11:0] rd_mux_addr; + assign rd_mux_addr = decoded_addr; + + logic readback_err; + logic readback_done; + logic [31:0] readback_data; + always_comb begin + automatic logic [31:0] readback_data_var; + readback_data_var = '0; + if(rd_mux_addr == 12'h0) begin + readback_data_var[7:0] = 8'h0; + readback_data_var[15:8] = 8'h9; + readback_data_var[23:16] = 8'h0; + readback_data_var[31:24] = 8'h0; + end + if(rd_mux_addr == 12'h4) begin + readback_data_var[15:0] = 16'h0; + readback_data_var[31:16] = 16'h1; + end + if(rd_mux_addr == 12'h8) begin + readback_data_var[7:0] = field_storage.global_cfg.capability.num_chips.value; + readback_data_var[15:8] = field_storage.global_cfg.capability.num_phys.value; + readback_data_var[16] = field_storage.global_cfg.capability.per_chip_cfg.value; + readback_data_var[17] = field_storage.global_cfg.capability.per_phy_cfg.value; + readback_data_var[18] = field_storage.global_cfg.capability.chip_enable.value; + readback_data_var[19] = field_storage.global_cfg.capability.clock_divider.value; + readback_data_var[20] = field_storage.global_cfg.capability.staged_apply.value; + readback_data_var[21] = field_storage.global_cfg.capability.error_status.value; + readback_data_var[22] = field_storage.global_cfg.capability.rwds_sample_timing.value; + readback_data_var[23] = field_storage.global_cfg.capability.rwds_oe_timing.value; + end + if(rd_mux_addr == 12'hc) begin + readback_data_var[0] = field_storage.global_cfg.command.flush.value; + readback_data_var[1] = field_storage.global_cfg.command.apply.value; + end + if(rd_mux_addr == 12'h10) begin + readback_data_var[0] = field_storage.global_cfg.status.decode_error.value; + readback_data_var[1] = field_storage.global_cfg.status.busy.value; + readback_data_var[2] = field_storage.global_cfg.status.dirty.value; + end + if(rd_mux_addr == 12'h100) begin + readback_data_var[0] = field_storage.frontend.frontend_cfg.dual_phy.value; + end + if(rd_mux_addr == 12'h200) begin + readback_data_var[7:0] = field_storage.backend.clock_cfg.divider.value; + end + if(rd_mux_addr == 12'h300) begin + readback_data_var[7:0] = field_storage.phy_0.tx_delay.value.value; + end + if(rd_mux_addr == 12'h304) begin + readback_data_var[7:0] = field_storage.phy_0.rwds_timing.rwds_oe_setup_cycles.value; + end + if(rd_mux_addr == 12'h340) begin + readback_data_var[7:0] = field_storage.phy_1.tx_delay.value.value; + end + if(rd_mux_addr == 12'h344) begin + readback_data_var[7:0] = field_storage.phy_1.rwds_timing.rwds_oe_setup_cycles.value; + end + if(rd_mux_addr == 12'h400) begin + readback_data_var[31:22] = field_storage.chip_0.range_base.value.value; + end + if(rd_mux_addr == 12'h404) begin + readback_data_var[31:22] = field_storage.chip_0.range_bound.value.value; + end + if(rd_mux_addr == 12'h408) begin + readback_data_var[7:0] = field_storage.chip_0.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_0.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_0.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h40c) begin + readback_data_var[7:0] = field_storage.chip_0.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_0.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_0.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h410) begin + readback_data_var[15:0] = field_storage.chip_0.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h414) begin + readback_data_var[7:0] = field_storage.chip_0.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_0.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_0.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h418) begin + readback_data_var[7:0] = field_storage.chip_0.rx_delay.value.value; + end + if(rd_mux_addr == 12'h440) begin + readback_data_var[31:22] = field_storage.chip_1.range_base.value.value; + end + if(rd_mux_addr == 12'h444) begin + readback_data_var[31:22] = field_storage.chip_1.range_bound.value.value; + end + if(rd_mux_addr == 12'h448) begin + readback_data_var[7:0] = field_storage.chip_1.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_1.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_1.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h44c) begin + readback_data_var[7:0] = field_storage.chip_1.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_1.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_1.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h450) begin + readback_data_var[15:0] = field_storage.chip_1.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h454) begin + readback_data_var[7:0] = field_storage.chip_1.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_1.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_1.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h458) begin + readback_data_var[7:0] = field_storage.chip_1.rx_delay.value.value; + end + if(rd_mux_addr == 12'h480) begin + readback_data_var[31:22] = field_storage.chip_2.range_base.value.value; + end + if(rd_mux_addr == 12'h484) begin + readback_data_var[31:22] = field_storage.chip_2.range_bound.value.value; + end + if(rd_mux_addr == 12'h488) begin + readback_data_var[7:0] = field_storage.chip_2.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_2.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_2.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h48c) begin + readback_data_var[7:0] = field_storage.chip_2.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_2.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_2.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h490) begin + readback_data_var[15:0] = field_storage.chip_2.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h494) begin + readback_data_var[7:0] = field_storage.chip_2.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_2.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_2.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h498) begin + readback_data_var[7:0] = field_storage.chip_2.rx_delay.value.value; + end + if(rd_mux_addr == 12'h4c0) begin + readback_data_var[31:22] = field_storage.chip_3.range_base.value.value; + end + if(rd_mux_addr == 12'h4c4) begin + readback_data_var[31:22] = field_storage.chip_3.range_bound.value.value; + end + if(rd_mux_addr == 12'h4c8) begin + readback_data_var[7:0] = field_storage.chip_3.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_3.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_3.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h4cc) begin + readback_data_var[7:0] = field_storage.chip_3.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_3.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_3.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h4d0) begin + readback_data_var[15:0] = field_storage.chip_3.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h4d4) begin + readback_data_var[7:0] = field_storage.chip_3.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_3.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_3.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h4d8) begin + readback_data_var[7:0] = field_storage.chip_3.rx_delay.value.value; + end + if(rd_mux_addr == 12'h500) begin + readback_data_var[31:22] = field_storage.chip_4.range_base.value.value; + end + if(rd_mux_addr == 12'h504) begin + readback_data_var[31:22] = field_storage.chip_4.range_bound.value.value; + end + if(rd_mux_addr == 12'h508) begin + readback_data_var[7:0] = field_storage.chip_4.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_4.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_4.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h50c) begin + readback_data_var[7:0] = field_storage.chip_4.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_4.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_4.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h510) begin + readback_data_var[15:0] = field_storage.chip_4.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h514) begin + readback_data_var[7:0] = field_storage.chip_4.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_4.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_4.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h518) begin + readback_data_var[7:0] = field_storage.chip_4.rx_delay.value.value; + end + if(rd_mux_addr == 12'h540) begin + readback_data_var[31:22] = field_storage.chip_5.range_base.value.value; + end + if(rd_mux_addr == 12'h544) begin + readback_data_var[31:22] = field_storage.chip_5.range_bound.value.value; + end + if(rd_mux_addr == 12'h548) begin + readback_data_var[7:0] = field_storage.chip_5.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_5.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_5.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h54c) begin + readback_data_var[7:0] = field_storage.chip_5.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_5.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_5.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h550) begin + readback_data_var[15:0] = field_storage.chip_5.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h554) begin + readback_data_var[7:0] = field_storage.chip_5.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_5.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_5.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h558) begin + readback_data_var[7:0] = field_storage.chip_5.rx_delay.value.value; + end + if(rd_mux_addr == 12'h580) begin + readback_data_var[31:22] = field_storage.chip_6.range_base.value.value; + end + if(rd_mux_addr == 12'h584) begin + readback_data_var[31:22] = field_storage.chip_6.range_bound.value.value; + end + if(rd_mux_addr == 12'h588) begin + readback_data_var[7:0] = field_storage.chip_6.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_6.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_6.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h58c) begin + readback_data_var[7:0] = field_storage.chip_6.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_6.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_6.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h590) begin + readback_data_var[15:0] = field_storage.chip_6.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h594) begin + readback_data_var[7:0] = field_storage.chip_6.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_6.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_6.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h598) begin + readback_data_var[7:0] = field_storage.chip_6.rx_delay.value.value; + end + if(rd_mux_addr == 12'h5c0) begin + readback_data_var[31:22] = field_storage.chip_7.range_base.value.value; + end + if(rd_mux_addr == 12'h5c4) begin + readback_data_var[31:22] = field_storage.chip_7.range_bound.value.value; + end + if(rd_mux_addr == 12'h5c8) begin + readback_data_var[7:0] = field_storage.chip_7.address_cfg.address_space.value; + readback_data_var[15:8] = field_storage.chip_7.address_cfg.address_mask_msb.value; + readback_data_var[16] = field_storage.chip_7.address_cfg.enable.value; + end + if(rd_mux_addr == 12'h5cc) begin + readback_data_var[7:0] = field_storage.chip_7.latency_cfg.t_latency_access.value; + readback_data_var[15:8] = field_storage.chip_7.latency_cfg.rwds_sample_delay.value; + readback_data_var[16] = field_storage.chip_7.latency_cfg.en_latency_additional.value; + end + if(rd_mux_addr == 12'h5d0) begin + readback_data_var[15:0] = field_storage.chip_7.burst_cfg.t_burst_max.value; + end + if(rd_mux_addr == 12'h5d4) begin + readback_data_var[7:0] = field_storage.chip_7.chip_timing.t_read_write_recovery.value; + readback_data_var[15:8] = field_storage.chip_7.chip_timing.t_csh_cycles.value; + readback_data_var[23:16] = field_storage.chip_7.chip_timing.csn_to_ck_cycles.value; + end + if(rd_mux_addr == 12'h5d8) begin + readback_data_var[7:0] = field_storage.chip_7.rx_delay.value.value; + end + if(rd_mux_addr == 12'hffc) begin + readback_data_var[31:0] = 32'h0; + end + readback_data = readback_data_var; + readback_done = decoded_req & ~decoded_req_is_wr; + readback_err = '0; + end + + assign cpuif_rd_ack = readback_done; + assign cpuif_rd_data = readback_data; + assign cpuif_rd_err = readback_err; +endmodule diff --git a/src/regs/hyperbus_cfg_regblock_pkg.sv b/src/regs/hyperbus_cfg_regblock_pkg.sv new file mode 100644 index 0000000..807817d --- /dev/null +++ b/src/regs/hyperbus_cfg_regblock_pkg.sv @@ -0,0 +1,566 @@ +// Generated by PeakRDL-regblock - A free and open-source SystemVerilog generator +// https://github.com/SystemRDL/PeakRDL-regblock + +package hyperbus_cfg_regblock_pkg; + + localparam HYPERBUS_CFG_REGBLOCK_DATA_WIDTH = 32; + localparam HYPERBUS_CFG_REGBLOCK_MIN_ADDR_WIDTH = 12; + localparam HYPERBUS_CFG_REGBLOCK_SIZE = 'h1000; + + typedef struct { + logic [7:0] next; + } hyperbus_cfg_regs__capability__num_chips__in_t; + + typedef struct { + logic [7:0] next; + } hyperbus_cfg_regs__capability__num_phys__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__per_chip_cfg__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__per_phy_cfg__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__chip_enable__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__clock_divider__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__staged_apply__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__error_status__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__rwds_sample_timing__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__capability__rwds_oe_timing__in_t; + + typedef struct { + hyperbus_cfg_regs__capability__num_chips__in_t num_chips; + hyperbus_cfg_regs__capability__num_phys__in_t num_phys; + hyperbus_cfg_regs__capability__per_chip_cfg__in_t per_chip_cfg; + hyperbus_cfg_regs__capability__per_phy_cfg__in_t per_phy_cfg; + hyperbus_cfg_regs__capability__chip_enable__in_t chip_enable; + hyperbus_cfg_regs__capability__clock_divider__in_t clock_divider; + hyperbus_cfg_regs__capability__staged_apply__in_t staged_apply; + hyperbus_cfg_regs__capability__error_status__in_t error_status; + hyperbus_cfg_regs__capability__rwds_sample_timing__in_t rwds_sample_timing; + hyperbus_cfg_regs__capability__rwds_oe_timing__in_t rwds_oe_timing; + } hyperbus_cfg_regs__capability__in_t; + + typedef struct { + logic next; + logic hwset; + } hyperbus_cfg_regs__status__decode_error__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__status__busy__in_t; + + typedef struct { + logic next; + } hyperbus_cfg_regs__status__dirty__in_t; + + typedef struct { + hyperbus_cfg_regs__status__decode_error__in_t decode_error; + hyperbus_cfg_regs__status__busy__in_t busy; + hyperbus_cfg_regs__status__dirty__in_t dirty; + } hyperbus_cfg_regs__status__in_t; + + typedef struct { + hyperbus_cfg_regs__capability__in_t capability; + hyperbus_cfg_regs__status__in_t status; + } hyperbus_cfg_regs__global_regs__in_t; + + typedef struct { + hyperbus_cfg_regs__global_regs__in_t global_cfg; + } hyperbus_cfg_regs__in_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__ip_version__revision__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__ip_version__patch__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__ip_version__minor__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__ip_version__major__out_t; + + typedef struct { + hyperbus_cfg_regs__ip_version__revision__out_t revision; + hyperbus_cfg_regs__ip_version__patch__out_t patch; + hyperbus_cfg_regs__ip_version__minor__out_t minor; + hyperbus_cfg_regs__ip_version__major__out_t major; + } hyperbus_cfg_regs__ip_version__out_t; + + typedef struct { + logic [15:0] value; + } hyperbus_cfg_regs__reg_if_version__minor__out_t; + + typedef struct { + logic [15:0] value; + } hyperbus_cfg_regs__reg_if_version__major__out_t; + + typedef struct { + hyperbus_cfg_regs__reg_if_version__minor__out_t minor; + hyperbus_cfg_regs__reg_if_version__major__out_t major; + } hyperbus_cfg_regs__reg_if_version__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__capability__num_chips__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__capability__num_phys__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__per_chip_cfg__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__per_phy_cfg__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__chip_enable__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__clock_divider__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__staged_apply__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__error_status__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__rwds_sample_timing__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__capability__rwds_oe_timing__out_t; + + typedef struct { + hyperbus_cfg_regs__capability__num_chips__out_t num_chips; + hyperbus_cfg_regs__capability__num_phys__out_t num_phys; + hyperbus_cfg_regs__capability__per_chip_cfg__out_t per_chip_cfg; + hyperbus_cfg_regs__capability__per_phy_cfg__out_t per_phy_cfg; + hyperbus_cfg_regs__capability__chip_enable__out_t chip_enable; + hyperbus_cfg_regs__capability__clock_divider__out_t clock_divider; + hyperbus_cfg_regs__capability__staged_apply__out_t staged_apply; + hyperbus_cfg_regs__capability__error_status__out_t error_status; + hyperbus_cfg_regs__capability__rwds_sample_timing__out_t rwds_sample_timing; + hyperbus_cfg_regs__capability__rwds_oe_timing__out_t rwds_oe_timing; + } hyperbus_cfg_regs__capability__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__command__flush__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__command__apply__out_t; + + typedef struct { + hyperbus_cfg_regs__command__flush__out_t flush; + hyperbus_cfg_regs__command__apply__out_t apply; + } hyperbus_cfg_regs__command__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__status__decode_error__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__status__busy__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__status__dirty__out_t; + + typedef struct { + hyperbus_cfg_regs__status__decode_error__out_t decode_error; + hyperbus_cfg_regs__status__busy__out_t busy; + hyperbus_cfg_regs__status__dirty__out_t dirty; + } hyperbus_cfg_regs__status__out_t; + + typedef struct { + hyperbus_cfg_regs__ip_version__out_t ip_version; + hyperbus_cfg_regs__reg_if_version__out_t reg_if_version; + hyperbus_cfg_regs__capability__out_t capability; + hyperbus_cfg_regs__command__out_t command; + hyperbus_cfg_regs__status__out_t status; + } hyperbus_cfg_regs__global_regs__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__frontend_cfg__dual_phy__out_t; + + typedef struct { + hyperbus_cfg_regs__frontend_cfg__dual_phy__out_t dual_phy; + } hyperbus_cfg_regs__frontend_cfg__out_t; + + typedef struct { + hyperbus_cfg_regs__frontend_cfg__out_t frontend_cfg; + } hyperbus_cfg_regs__frontend_regs__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__clock_cfg__divider__out_t; + + typedef struct { + hyperbus_cfg_regs__clock_cfg__divider__out_t divider; + } hyperbus_cfg_regs__clock_cfg__out_t; + + typedef struct { + hyperbus_cfg_regs__clock_cfg__out_t clock_cfg; + } hyperbus_cfg_regs__backend_regs__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__tx_delay__value__out_t; + + typedef struct { + hyperbus_cfg_regs__tx_delay__value__out_t value; + } hyperbus_cfg_regs__tx_delay__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__rwds_timing__rwds_oe_setup_cycles__out_t; + + typedef struct { + hyperbus_cfg_regs__rwds_timing__rwds_oe_setup_cycles__out_t rwds_oe_setup_cycles; + } hyperbus_cfg_regs__rwds_timing__out_t; + + typedef struct { + hyperbus_cfg_regs__tx_delay__out_t tx_delay; + hyperbus_cfg_regs__rwds_timing__out_t rwds_timing; + } hyperbus_cfg_regs__phy_regs__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base__value__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base__value__out_t value; + } hyperbus_cfg_regs__range_base__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound__value__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound__value__out_t value; + } hyperbus_cfg_regs__range_bound__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__address_cfg__address_space__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__address_cfg__address_mask_msb__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__address_cfg__enable__out_t; + + typedef struct { + hyperbus_cfg_regs__address_cfg__address_space__out_t address_space; + hyperbus_cfg_regs__address_cfg__address_mask_msb__out_t address_mask_msb; + hyperbus_cfg_regs__address_cfg__enable__out_t enable; + } hyperbus_cfg_regs__address_cfg__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__latency_cfg__t_latency_access__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__latency_cfg__rwds_sample_delay__out_t; + + typedef struct { + logic value; + } hyperbus_cfg_regs__latency_cfg__en_latency_additional__out_t; + + typedef struct { + hyperbus_cfg_regs__latency_cfg__t_latency_access__out_t t_latency_access; + hyperbus_cfg_regs__latency_cfg__rwds_sample_delay__out_t rwds_sample_delay; + hyperbus_cfg_regs__latency_cfg__en_latency_additional__out_t en_latency_additional; + } hyperbus_cfg_regs__latency_cfg__out_t; + + typedef struct { + logic [15:0] value; + } hyperbus_cfg_regs__burst_cfg__t_burst_max__out_t; + + typedef struct { + hyperbus_cfg_regs__burst_cfg__t_burst_max__out_t t_burst_max; + } hyperbus_cfg_regs__burst_cfg__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__chip_timing__t_read_write_recovery__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__chip_timing__t_csh_cycles__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__chip_timing__csn_to_ck_cycles__out_t; + + typedef struct { + hyperbus_cfg_regs__chip_timing__t_read_write_recovery__out_t t_read_write_recovery; + hyperbus_cfg_regs__chip_timing__t_csh_cycles__out_t t_csh_cycles; + hyperbus_cfg_regs__chip_timing__csn_to_ck_cycles__out_t csn_to_ck_cycles; + } hyperbus_cfg_regs__chip_timing__out_t; + + typedef struct { + logic [7:0] value; + } hyperbus_cfg_regs__rx_delay__value__out_t; + + typedef struct { + hyperbus_cfg_regs__rx_delay__value__out_t value; + } hyperbus_cfg_regs__rx_delay__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base__out_t range_base; + hyperbus_cfg_regs__range_bound__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_aea1d0e1__value_reset_1__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_aea1d0e1__value_reset_1__out_t value; + } hyperbus_cfg_regs__range_base_value_aea1d0e1__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_e30f0c3f__value_reset_2__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_e30f0c3f__value_reset_2__out_t value; + } hyperbus_cfg_regs__range_bound_value_e30f0c3f__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_aea1d0e1__out_t range_base; + hyperbus_cfg_regs__range_bound_value_e30f0c3f__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_de2a4636_range_bound_d40fd139__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_e30f0c3f__value_reset_2__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_e30f0c3f__value_reset_2__out_t value; + } hyperbus_cfg_regs__range_base_value_e30f0c3f__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_2f629ec9__value_reset_3__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_2f629ec9__value_reset_3__out_t value; + } hyperbus_cfg_regs__range_bound_value_2f629ec9__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_e30f0c3f__out_t range_base; + hyperbus_cfg_regs__range_bound_value_2f629ec9__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_b054dd4c_range_bound_a4d5f83b__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_2f629ec9__value_reset_3__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_2f629ec9__value_reset_3__out_t value; + } hyperbus_cfg_regs__range_base_value_2f629ec9__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_a1e733c2__value_reset_4__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_a1e733c2__value_reset_4__out_t value; + } hyperbus_cfg_regs__range_bound_value_a1e733c2__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_2f629ec9__out_t range_base; + hyperbus_cfg_regs__range_bound_value_a1e733c2__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_f7266ded_range_bound_5bf260e9__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_a1e733c2__value_reset_4__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_a1e733c2__value_reset_4__out_t value; + } hyperbus_cfg_regs__range_base_value_a1e733c2__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_342915db__value_reset_5__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_342915db__value_reset_5__out_t value; + } hyperbus_cfg_regs__range_bound_value_342915db__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_a1e733c2__out_t range_base; + hyperbus_cfg_regs__range_bound_value_342915db__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_0d543b99_range_bound_1fffc3a2__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_342915db__value_reset_5__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_342915db__value_reset_5__out_t value; + } hyperbus_cfg_regs__range_base_value_342915db__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_883c384f__value_reset_6__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_883c384f__value_reset_6__out_t value; + } hyperbus_cfg_regs__range_bound_value_883c384f__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_342915db__out_t range_base; + hyperbus_cfg_regs__range_bound_value_883c384f__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_e068ab2e_range_bound_9afa5911__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_883c384f__value_reset_6__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_883c384f__value_reset_6__out_t value; + } hyperbus_cfg_regs__range_base_value_883c384f__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_d0d03147__value_reset_7__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_d0d03147__value_reset_7__out_t value; + } hyperbus_cfg_regs__range_bound_value_d0d03147__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_883c384f__out_t range_base; + hyperbus_cfg_regs__range_bound_value_d0d03147__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_ac4fb754_range_bound_24b9644b__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_base_value_d0d03147__value_reset_7__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_d0d03147__value_reset_7__out_t value; + } hyperbus_cfg_regs__range_base_value_d0d03147__out_t; + + typedef struct { + logic [9:0] value; + } hyperbus_cfg_regs__range_bound_value_971bab53__value_reset_8__out_t; + + typedef struct { + hyperbus_cfg_regs__range_bound_value_971bab53__value_reset_8__out_t value; + } hyperbus_cfg_regs__range_bound_value_971bab53__out_t; + + typedef struct { + hyperbus_cfg_regs__range_base_value_d0d03147__out_t range_base; + hyperbus_cfg_regs__range_bound_value_971bab53__out_t range_bound; + hyperbus_cfg_regs__address_cfg__out_t address_cfg; + hyperbus_cfg_regs__latency_cfg__out_t latency_cfg; + hyperbus_cfg_regs__burst_cfg__out_t burst_cfg; + hyperbus_cfg_regs__chip_timing__out_t chip_timing; + hyperbus_cfg_regs__rx_delay__out_t rx_delay; + } hyperbus_cfg_regs__chip_regs_range_base_63c2ba90_range_bound_602aea67__out_t; + + typedef struct { + logic [31:0] value; + } hyperbus_cfg_regs__reserved_top__value__out_t; + + typedef struct { + hyperbus_cfg_regs__reserved_top__value__out_t value; + } hyperbus_cfg_regs__reserved_top__out_t; + + typedef struct { + hyperbus_cfg_regs__global_regs__out_t global_cfg; + hyperbus_cfg_regs__frontend_regs__out_t frontend; + hyperbus_cfg_regs__backend_regs__out_t backend; + hyperbus_cfg_regs__phy_regs__out_t phy_0; + hyperbus_cfg_regs__phy_regs__out_t phy_1; + hyperbus_cfg_regs__chip_regs__out_t chip_0; + hyperbus_cfg_regs__chip_regs_range_base_de2a4636_range_bound_d40fd139__out_t chip_1; + hyperbus_cfg_regs__chip_regs_range_base_b054dd4c_range_bound_a4d5f83b__out_t chip_2; + hyperbus_cfg_regs__chip_regs_range_base_f7266ded_range_bound_5bf260e9__out_t chip_3; + hyperbus_cfg_regs__chip_regs_range_base_0d543b99_range_bound_1fffc3a2__out_t chip_4; + hyperbus_cfg_regs__chip_regs_range_base_e068ab2e_range_bound_9afa5911__out_t chip_5; + hyperbus_cfg_regs__chip_regs_range_base_ac4fb754_range_bound_24b9644b__out_t chip_6; + hyperbus_cfg_regs__chip_regs_range_base_63c2ba90_range_bound_602aea67__out_t chip_7; + hyperbus_cfg_regs__reserved_top__out_t reserved_top; + } hyperbus_cfg_regs__out_t; +endpackage diff --git a/src/regs/hyperbus_cfg_regs.rdl b/src/regs/hyperbus_cfg_regs.rdl new file mode 100644 index 0000000..a81f7f9 --- /dev/null +++ b/src/regs/hyperbus_cfg_regs.rdl @@ -0,0 +1,148 @@ +addrmap hyperbus_cfg_regs { + desc = "HyperBus controller configuration register map. Enabled chip ranges must be 4 MiB aligned, ordered by chip-select index, and non-overlapping."; + + reg ip_version { + desc = "IP version (major.minor.patch.revision)."; + field { sw = r; hw = r; reset = 8'd0; } major[31:24]; + field { sw = r; hw = r; reset = 8'd0; } minor[23:16]; + field { sw = r; hw = r; reset = 8'd9; } patch[15:8]; + field { sw = r; hw = r; reset = 8'd0; } revision[7:0]; + }; + reg reg_if_version { + desc = "Register interface version."; + field { sw = r; hw = r; reset = 16'd1; } major[31:16]; + field { sw = r; hw = r; reset = 16'd0; } minor[15:0]; + }; + reg capability { + desc = "Hardware-provided implementation capabilities."; + field { desc = "Number of implemented chip selects."; sw = r; hw = rw; reset = 8'd0; } num_chips[7:0]; + field { desc = "Number of implemented PHY lanes."; sw = r; hw = rw; reset = 8'd0; } num_phys[15:8]; + field { desc = "Each chip record controls its corresponding chip rather than chip 0 being shared."; sw = r; hw = rw; reset = 1'b0; } per_chip_cfg[16:16]; + field { desc = "Each PHY record controls its corresponding lane rather than PHY 0 being shared."; sw = r; hw = rw; reset = 1'b0; } per_phy_cfg[17:17]; + field { desc = "Per-chip enable bits participate in address decoding."; sw = r; hw = rw; reset = 1'b0; } chip_enable[18:18]; + field { desc = "CLOCK_CFG controls an implemented backend clock divider."; sw = r; hw = rw; reset = 1'b0; } clock_divider[19:19]; + field { desc = "FLUSH and APPLY commands implement a staged configuration barrier."; sw = r; hw = rw; reset = 1'b0; } staged_apply[20:20]; + field { desc = "STATUS reports sticky controller errors."; sw = r; hw = rw; reset = 1'b0; } error_status[21:21]; + field { desc = "Per-chip RWDS sample timing is implemented."; sw = r; hw = rw; reset = 1'b0; } rwds_sample_timing[22:22]; + field { desc = "Per-PHY RWDS output-enable timing is implemented."; sw = r; hw = rw; reset = 1'b0; } rwds_oe_timing[23:23]; + }; + reg command { + desc = "Single-cycle write-one command strobes, active when capability.staged_apply is set; otherwise writes are retained only as inert pulses."; + field { sw = rw; hw = r; singlepulse = true; reset = 1'b0; } flush; + field { sw = rw; hw = r; singlepulse = true; reset = 1'b0; } apply; + }; + reg status { + desc = "Controller status."; + field { sw = rw; hw = rw; onwrite = woclr; hwset = true; precedence = hw; reset = 1'b0; } decode_error; + field { sw = r; hw = rw; reset = 1'b0; } busy; + field { sw = r; hw = rw; reset = 1'b0; } dirty; + }; + reg frontend_cfg { + desc = "Frontend configuration. dual_phy must be 0 or 1."; + field { sw = rw; hw = r; reset = 1'b1; } dual_phy; + }; + reg clock_cfg { + desc = "Backend clock-divider configuration, active when capability.clock_divider is set; divider values must be at least 2."; + field { sw = rw; hw = r; reset = 8'd8; } divider[7:0]; + }; + reg tx_delay { + desc = "PHY transmit delay. PHY 0 is shared when capability.per_phy_cfg is clear."; + field { sw = rw; hw = r; reset = 8'h10; } value[7:0]; + }; + reg rwds_timing { + desc = "PHY RWDS output-enable timing. rwds_oe_setup_cycles must be at most 15 and is active when capability.rwds_oe_timing is set."; + field { sw = rw; hw = r; reset = 8'd1; } rwds_oe_setup_cycles[7:0]; + }; + reg range_base { + desc = "Inclusive 4 MiB-aligned chip address range base."; + field { sw = rw; hw = r; reset = 10'd0; } value[31:22]; + }; + reg range_bound { + desc = "Exclusive 4 MiB-aligned chip address range bound."; + field { sw = rw; hw = r; reset = 10'd1; } value[31:22]; + }; + reg address_cfg { + desc = "Chip address-space interpretation and enable. address_space and enable must be 0 or 1, and address_mask_msb must be at most 31. Chip 0 is shared when capability.per_chip_cfg is clear; enable is active when capability.chip_enable is set."; + field { sw = rw; hw = r; reset = 8'd0; } address_space[7:0]; + field { sw = rw; hw = r; reset = 8'd25; } address_mask_msb[15:8]; + field { sw = rw; hw = r; reset = 1'b1; } enable[16:16]; + }; + reg latency_cfg { + desc = "Chip latency configuration. t_latency_access must be 3 through 15; rwds_sample_delay must be at most 15 and is active when capability.rwds_sample_timing is set. Chip 0 is shared when capability.per_chip_cfg is clear."; + field { sw = rw; hw = r; reset = 8'd6; } t_latency_access[7:0]; + field { sw = rw; hw = r; reset = 8'd0; } rwds_sample_delay[15:8]; + field { sw = rw; hw = r; reset = 1'b0; } en_latency_additional[16:16]; + }; + reg burst_cfg { + desc = "Chip burst configuration. Chip 0 is shared when capability.per_chip_cfg is clear."; + field { sw = rw; hw = r; reset = 16'd350; } t_burst_max[15:0]; + }; + reg chip_timing { + desc = "Chip-select and read/write timing; byte-backed timing values must be at most 15. Chip 0 is shared when capability.per_chip_cfg is clear."; + field { sw = rw; hw = r; reset = 8'd6; } t_read_write_recovery[7:0]; + field { sw = rw; hw = r; reset = 8'd1; } t_csh_cycles[15:8]; + field { sw = rw; hw = r; reset = 8'd0; } csn_to_ck_cycles[23:16]; + }; + reg rx_delay { + desc = "Chip receive delay. Chip 0 is shared when capability.per_chip_cfg is clear."; + field { sw = rw; hw = r; reset = 8'h10; } value[7:0]; + }; + reg reserved_top { + desc = "Reserved endpoint that fixes the register window size to 4 KiB."; + field { sw = r; hw = r; reset = 32'd0; } value[31:0]; + }; + regfile phy_regs { + tx_delay tx_delay @0x00; + rwds_timing rwds_timing @0x04; + }; + regfile chip_regs { + range_base range_base @0x00; + range_bound range_bound @0x04; + address_cfg address_cfg @0x08; + latency_cfg latency_cfg @0x0c; + burst_cfg burst_cfg @0x10; + chip_timing chip_timing @0x14; + rx_delay rx_delay @0x18; + }; + regfile global_regs { + ip_version ip_version @0x000; + reg_if_version reg_if_version @0x004; + capability capability @0x008; + command command @0x00c; + status status @0x010; + }; + regfile frontend_regs { + frontend_cfg frontend_cfg @0x000; + }; + regfile backend_regs { + clock_cfg clock_cfg @0x000; + }; + global_regs global_cfg @0x000; + frontend_regs frontend @0x100; + backend_regs backend @0x200; + phy_regs phy_0 @0x300; + phy_regs phy_1 @0x340; + chip_regs chip_0 @0x400; + chip_regs chip_1 @0x440; + chip_regs chip_2 @0x480; + chip_regs chip_3 @0x4c0; + chip_regs chip_4 @0x500; + chip_regs chip_5 @0x540; + chip_regs chip_6 @0x580; + chip_regs chip_7 @0x5c0; + chip_1.range_base.value->reset = 10'd1; + chip_1.range_bound.value->reset = 10'd2; + chip_2.range_base.value->reset = 10'd2; + chip_2.range_bound.value->reset = 10'd3; + chip_3.range_base.value->reset = 10'd3; + chip_3.range_bound.value->reset = 10'd4; + chip_4.range_base.value->reset = 10'd4; + chip_4.range_bound.value->reset = 10'd5; + chip_5.range_base.value->reset = 10'd5; + chip_5.range_bound.value->reset = 10'd6; + chip_6.range_base.value->reset = 10'd6; + chip_6.range_bound.value->reset = 10'd7; + chip_7.range_base.value->reset = 10'd7; + chip_7.range_bound.value->reset = 10'd8; + reserved_top reserved_top @0xffc; +}; diff --git a/test/axi_hyper_tb.sv b/test/axi_hyper_tb.sv index fcd42cd..fd1d57f 100644 --- a/test/axi_hyper_tb.sv +++ b/test/axi_hyper_tb.sv @@ -235,6 +235,10 @@ module axi_hyper_tb // Address Ranges // //////////////////// localparam axi_addr_t MemRegionStart = axi_addr_t'(32'h8000_0000); + localparam logic [31:0] CfgFrontendAddr = 32'h0000_0100; + localparam logic [31:0] CfgChip0AddressAddr = 32'h0000_0408; + localparam logic [31:0] CfgChip0Memory = 32'h0001_1900; + localparam logic [31:0] CfgChip0Register = 32'h0001_1901; localparam axi_addr_t MemRegionLength = axi_addr_t'(TbDramDataWidth * TbDramLenWidth); logic s_error; @@ -378,7 +382,7 @@ module axi_hyper_tb #600350ns; // switch memory address space to register space - reg_master.send_write(32'h7<<2, 1'b1, '1, s_reg_error); + reg_master.send_write(CfgChip0AddressAddr, CfgChip0Register, '1, s_reg_error); if (s_reg_error != 1'b0) $error("unexpected error"); // enable variable latency so we can test RWDS sampling @@ -386,7 +390,7 @@ module axi_hyper_tb axi_write_32(32'h8000_0000 + S27KS_CFG0_REG_OFFSET, (s27ks_cfg0 | s27ks_cfg0 << 16)); // switch back to memory address space - reg_master.send_write(32'h7<<2, 1'b0, '1, s_reg_error); + reg_master.send_write(CfgChip0AddressAddr, CfgChip0Memory, '1, s_reg_error); if (s_reg_error != 1'b0) $error("unexpected error"); check_consecutive_reads(axi_ctrl_mst); @@ -411,31 +415,7 @@ module axi_hyper_tb $display("= Use only phy 0 ="); $display("==========================="); - reg_master.send_write(32'h20,1'b0,'1,s_reg_error); - reg_master.send_write(32'h24,1'b0,'1,s_reg_error); - if (s_reg_error != 1'b0) $error("unexpected error"); - - axi_rand_mst.reset(); - axi_ctrl_mst.reset_master(); - check_odd_subword_accesses(axi_ctrl_mst); - - $display("==========================="); - $display("= Random AXI transactions ="); - $display("==========================="); - - axi_rand_mst.run(TbNumReads, TbNumWrites); - - $display("==========================="); - $display("= Test finished ="); - $display("==========================="); - - mst_scoreboard.clear_range(32'h8000_0000, 32'h8000_0000 + ( TbDramDataWidth * TbDramLenWidth )); - - $display("==========================="); - $display("= Use only phy 1 ="); - $display("==========================="); - - reg_master.send_write(32'h24,1'b1,'1,s_reg_error); + reg_master.send_write(CfgFrontendAddr, 32'h0, '1, s_reg_error); if (s_reg_error != 1'b0) $error("unexpected error"); axi_rand_mst.reset(); diff --git a/test/dut_if.sv b/test/dut_if.sv index 232b541..e63d9e9 100644 --- a/test/dut_if.sv +++ b/test/dut_if.sv @@ -137,7 +137,6 @@ module dut_if .axi_b_chan_t ( axi_b_chan_t ), .axi_ar_chan_t ( axi_ar_chan_t ), .axi_r_chan_t ( axi_r_chan_t ), - .RegAddrWidth ( RegAw ), .RegDataWidth ( RegDw ), .reg_req_t ( reg_req_t ), .reg_rsp_t ( reg_rsp_t ), diff --git a/test/fixture_hyperbus.sv b/test/fixture_hyperbus.sv index 9bd24b5..3967143 100644 --- a/test/fixture_hyperbus.sv +++ b/test/fixture_hyperbus.sv @@ -180,7 +180,6 @@ module fixture_hyperbus #( .axi_b_chan_t ( b_chan_t ), .axi_ar_chan_t ( ar_chan_t ), .axi_r_chan_t ( r_chan_t ), - .RegAddrWidth ( RegAw ), .RegDataWidth ( RegDw ), .reg_req_t ( reg_req_t ), .reg_rsp_t ( reg_rsp_t ), diff --git a/test/hyperbus_cfg_regs_tb.sv b/test/hyperbus_cfg_regs_tb.sv new file mode 100644 index 0000000..a9e8f9f --- /dev/null +++ b/test/hyperbus_cfg_regs_tb.sv @@ -0,0 +1,251 @@ +// Copyright 2026 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 + +module hyperbus_cfg_regs_tb; + + localparam int unsigned NumChips = 8; + + typedef struct packed { + logic [31:0] addr; + logic write; + logic [31:0] wdata; + logic [3:0] wstrb; + logic valid; + } reg_req_t; + + typedef struct packed { + logic [31:0] rdata; + logic error; + logic ready; + } reg_rsp_t; + + typedef struct packed { + logic [31:0] start_addr; + logic [31:0] end_addr; + logic [2:0] idx; + } rule_t; + + logic clk; + logic rst_n; + reg_req_t reg_req; + reg_rsp_t reg_rsp; + hyperbus_pkg::frontend_cfg_t frontend_cfg; + hyperbus_pkg::phy_cfg_t phy_cfg; + rule_t [NumChips-1:0] chip_rules; + logic trans_active; + logic cfg_busy; + logic decode_error; + logic cfg_dirty; + logic flush_req; + logic apply_req; + int unsigned command_pulse_count; + + task automatic reg_write_strobe(input logic [31:0] addr, input logic [31:0] data, + input logic [3:0] strb); + @(negedge clk); + reg_req = '{addr: addr, write: 1'b1, wdata: data, wstrb: strb, valid: 1'b1}; + do @(posedge clk); while (!reg_rsp.ready); + if (reg_rsp.error) $error("Register write to 0x%0h failed", addr); + @(negedge clk); + reg_req.valid = 1'b0; + endtask + + task automatic reg_write(input logic [31:0] addr, input logic [31:0] data); + reg_write_strobe(addr, data, 4'b1111); + endtask + + task automatic reg_write_error(input logic [31:0] addr, input logic [31:0] data, + input logic [3:0] strb); + @(negedge clk); + reg_req = '{addr: addr, write: 1'b1, wdata: data, wstrb: strb, valid: 1'b1}; + do @(posedge clk); while (!reg_rsp.ready); + if (!reg_rsp.error) $error("Invalid register write to 0x%0h was accepted", addr); + @(negedge clk); + reg_req.valid = 1'b0; + endtask + + task automatic reg_read(input logic [31:0] addr, output logic [31:0] data); + @(negedge clk); + reg_req = '{addr: addr, write: 1'b0, wdata: '0, wstrb: '0, valid: 1'b1}; + do @(posedge clk); while (!reg_rsp.ready); + data = reg_rsp.rdata; + if (reg_rsp.error) $error("Register read from 0x%0h failed", addr); + @(negedge clk); + reg_req.valid = 1'b0; + endtask + + task automatic reg_read_error(input logic [31:0] addr); + logic [31:0] unused; + @(negedge clk); + reg_req = '{addr: addr, write: 1'b0, wdata: '0, wstrb: '0, valid: 1'b1}; + do @(posedge clk); while (!reg_rsp.ready); + if (!reg_rsp.error) $error("Unmapped read from 0x%0h was accepted", addr); + unused = reg_rsp.rdata; + @(negedge clk); + reg_req.valid = 1'b0; + endtask + + always #5ns clk = ~clk; + + always @(posedge clk) begin + if (rst_n && flush_req && apply_req) command_pulse_count++; + end + + hyperbus_cfg_regs #( + .NumChips ( NumChips ), + .NumPhys ( 2 ), + .RegDataWidth ( 32 ), + .RegAddrWidth ( 32 ), + .CapabilityFeatures ( 8'hff ), + .reg_req_t ( reg_req_t ), + .reg_rsp_t ( reg_rsp_t ), + .rule_t ( rule_t ) + ) i_dut ( + .clk_i ( clk ), + .rst_ni ( rst_n ), + .reg_req_i ( reg_req ), + .reg_rsp_o ( reg_rsp ), + .frontend_cfg_o ( frontend_cfg ), + .phy_cfg_o ( phy_cfg ), + .chip_rules_o ( chip_rules ), + .trans_active_i ( trans_active ), + .cfg_busy_i ( cfg_busy ), + .decode_error_i ( decode_error ), + .cfg_dirty_i ( cfg_dirty ), + .flush_req_o ( flush_req ), + .apply_req_o ( apply_req ) + ); + + initial begin : proc_stimulus + logic [31:0] data; + + clk = 1'b0; + rst_n = 1'b0; + reg_req = '0; + trans_active = 1'b0; + cfg_busy = 1'b0; + decode_error = 1'b0; + cfg_dirty = 1'b0; + command_pulse_count = 0; + repeat (4) @(posedge clk); + rst_n = 1'b1; + repeat (2) @(posedge clk); + + reg_read(12'h000, data); + if (data != 32'h0000_0900) $error("Unexpected IP_VERSION reset: %h", data); + reg_read(12'h004, data); + if (data != 32'h0001_0000) $error("Unexpected REG_IF_VERSION reset: %h", data); + @(negedge clk); + reg_req = '{addr: 32'h00c, write: 1'b1, wdata: 32'h3, wstrb: 4'b1111, valid: 1'b1}; + do @(posedge clk); while (!reg_rsp.ready); + if (reg_rsp.error) $error("COMMAND write failed"); + @(negedge clk); + reg_req.valid = 1'b0; + repeat (2) @(posedge clk); + #1ns; + if (command_pulse_count != 1) begin + $error("COMMAND strobes were sampled %0d times", command_pulse_count); + end + if (flush_req || apply_req) $error("COMMAND strobes were not one-cycle pulses"); + reg_read(12'h00c, data); + if (data != 32'h0) $error("COMMAND strobes did not clear after one cycle: %h", data); + reg_read(12'h008, data); + if (data != 32'h00ff_0208) $error("Unexpected CAPABILITY reset: %h", data); + reg_read(12'h010, data); + if (data != 32'h0) $error("Unexpected STATUS reset: %h", data); + reg_read(12'h100, data); + if ((data != 32'h1) || !frontend_cfg.phys_in_use) $error("Unexpected frontend reset"); + reg_read(12'h200, data); + if (data != 32'h8) $error("Unexpected CLOCK_CFG reset: %h", data); + reg_write_error(32'h200, 32'h1, 4'b0001); + reg_read(32'h200, data); + if (data != 32'h8) $error("Invalid divider write modified the register: %h", data); + reg_read(12'h300, data); + if (data != 32'h10) $error("Unexpected PHY0 TX_DELAY reset: %h", data); + reg_read(12'h340, data); + if (data != 32'h10) $error("Unexpected PHY1 TX_DELAY reset: %h", data); + reg_read(12'h408, data); + if (data != 32'h0001_1900) $error("Unexpected chip0 ADDRESS_CFG reset: %h", data); + reg_read(12'h40c, data); + if (data != 32'h6) $error("Unexpected chip0 LATENCY_CFG reset: %h", data); + reg_read(12'h410, data); + if (data != 32'd350) $error("Unexpected chip0 BURST_CFG reset: %h", data); + reg_read(12'h414, data); + if (data != 32'h106) $error("Unexpected chip0 CHIP_TIMING reset: %h", data); + reg_read(12'h418, data); + if (data != 32'h10) $error("Unexpected chip0 RX_DELAY reset: %h", data); + + for (int unsigned i = 0; i < NumChips; i++) begin + if ((chip_rules[i].start_addr != i * 32'h0040_0000) || + (chip_rules[i].end_addr != (i + 1) * 32'h0040_0000)) begin + $error("Unexpected reset address range for chip %0d", i); + end + end + + reg_write(12'h340, 32'h0000_00a5); + reg_read(12'h340, data); + if ((data != 8'ha5) || (phy_cfg.t_tx_clk_delay != 8'h10)) + $error("PHY1 write/read or PHY0 mapping failed"); + reg_write(12'h300, 32'h0000_005a); + if (phy_cfg.t_tx_clk_delay != 8'h5a) $error("PHY0 TX_DELAY mapping failed"); + + reg_write(12'h400 + 12'h1c0, 32'h8134_5678); + reg_read(12'h400 + 12'h1c0, data); + if ((data != 32'h8100_0000) || (chip_rules[7].start_addr != 32'h8100_0000)) + $error("Chip7 address alignment was not applied"); + + reg_write(12'h40c, 32'h0001_0007); + reg_read(12'h40c, data); + if ((data != 32'h0001_0007) || (phy_cfg.chip.t_latency_access != 7) || + !phy_cfg.chip.en_latency_additional) $error("Chip0 latency mapping failed"); + reg_write(12'h414, 32'h0000_010a); + reg_write_strobe(32'h414, 32'h0000_0007, 4'b0001); + reg_read(32'h414, data); + if (data != 32'h0000_0107) $error("Partial timing write failed: %h", data); + reg_write_error(32'h414, 32'h0000_0010, 4'b0001); + reg_read(32'h414, data); + if (data != 32'h0000_0107) $error("Invalid timing write modified the register: %h", data); + reg_write_error(32'h40c, 32'h0000_0002, 4'b0001); + reg_read(32'h40c, data); + if (data != 32'h0001_0007) $error("Invalid latency write modified the register: %h", data); + reg_read_error(12'h415); + + reg_read_error(12'h104); + reg_read_error(32'h0000_1000); + reg_read(12'hffc, data); + if (data != '0) $error("Reserved endpoint did not read as zero"); + + trans_active = 1'b1; + cfg_busy = 1'b1; + reg_read(32'h010, data); + if ((data & 32'h2) == 0) $error("STATUS read was blocked during active transfer"); + decode_error = 1'b1; + cfg_dirty = 1'b1; + reg_read(32'h010, data); + if ((data & 32'h5) != 32'h5) $error("STATUS hardware bits were not set: %h", data); + trans_active = 1'b0; + reg_write(32'h010, 32'h1); + reg_read(32'h010, data); + if ((data & 32'h1) == 0) $error("STATUS hwset did not win over W1C"); + decode_error = 1'b0; + cfg_dirty = 1'b0; + reg_write(32'h010, 32'h1); + reg_read(32'h010, data); + if ((data & 32'h1) != 0) $error("STATUS W1C did not clear decode_error"); + trans_active = 1'b1; + @(negedge clk); + reg_req = '{addr: 32'h000, write: 1'b0, wdata: '0, wstrb: '0, valid: 1'b1}; + repeat (3) begin + @(posedge clk); + if (reg_rsp.ready) $error("Access completed during active transfer"); + end + trans_active = 1'b0; + cfg_busy = 1'b0; + do @(posedge clk); while (!reg_rsp.ready); + @(negedge clk); + reg_req.valid = 1'b0; + + $finish; + end +endmodule