| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| { name: "adc_ctrl", | |
| human_name: "ADC Controller", | |
| one_line_desc: "Low-power controller for a dual-channel ADC with filtering and debouncing capability", | |
| one_paragraph_desc: ''' | |
| Analog to Digital Converter (ADC) Controller provides a simple front-end to an analog block that allows filtering and debouncing of the sampled data. | |
| ADC Controller supports 2 ADC channels and 8 filters on the values from the channels. | |
| It has debounce timers on the filter output and supports ADCs with 10-bit output. | |
| To enable usage while the device is sleeping, it runs on a slow always-on clock. | |
| In addition, it has a low power periodic scan mode for monitoring ADC channels. | |
| ''' | |
| design_spec: "../doc", | |
| dv_doc: "../doc/dv", | |
| hw_checklist: "../doc/checklist", | |
| sw_checklist: "/sw/device/lib/dif/dif_adc_ctrl", | |
| version: "1.0", | |
| life_stage: "L1", | |
| design_stage: "D3", | |
| verification_stage: "V2S", | |
| dif_stage: "S2", | |
| notes: "", | |
| clocking: [ | |
| {clock: "clk_i", reset: "rst_ni", primary: true}, | |
| {clock: "clk_aon_i", reset: "rst_aon_ni"} | |
| ] | |
| bus_interfaces: [ | |
| { protocol: "tlul", direction: "device" } | |
| ], | |
| inter_signal_list: [ | |
| { struct: "adc_ast", | |
| type: "req_rsp", | |
| act: "req", | |
| name: "adc", | |
| package: "ast_pkg", | |
| }, | |
| { struct: "logic", | |
| type: "uni", | |
| act: "req", | |
| name: "wkup_req", | |
| package: "", | |
| } | |
| ], | |
| interrupt_list: [ | |
| { name: "match_done", | |
| desc: "ADC match or measurement event done", | |
| } | |
| ], | |
| alert_list: [ | |
| { name: "fatal_fault", | |
| desc: ''' | |
| This fatal alert is triggered when a fatal TL-UL bus integrity fault is detected. | |
| ''' | |
| } | |
| ], | |
| wakeup_list: [ | |
| { name: "wkup_req", | |
| desc: "ADC wakeup request", | |
| } | |
| ], | |
| param_list: [ | |
| { name: "NumAdcFilter", | |
| type: "int", | |
| default: "8", | |
| desc: "Number for ADC filters", | |
| local: "true", | |
| } | |
| { name: "NumAdcChannel", | |
| type: "int", | |
| default: "2", | |
| desc: "Number for ADC channels", | |
| local: "true", | |
| } | |
| ], | |
| countermeasures: [ | |
| { name: "BUS.INTEGRITY", | |
| desc: "End-to-end bus integrity scheme." | |
| } | |
| ] | |
| regwidth: "32", | |
| registers: [ | |
| { name: "adc_en_ctl", | |
| desc: "ADC enable control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| resval: "0", | |
| async: "clk_aon_i", | |
| fields: [ | |
| { bits: "0", | |
| name: "adc_enable", | |
| desc: "1'b0: to power down ADC and ADC_CTRL FSM will enter the reset state; 1'b1: to power up ADC and ADC_CTRL FSM will start", | |
| tags: [ | |
| // Writes to ADC_EN_CTRL.ADC_ENABLE will cause side effects | |
| "excl:CsrNonInitTests:CsrExclWrite:CsrExclWriteCheck" | |
| ] | |
| } | |
| { bits: "1", | |
| name: "oneshot_mode", | |
| desc: "Oneshot mode does not care about the filter value. 1'b0: disable; 1'b1: enable", | |
| } | |
| ] | |
| } | |
| { name: "adc_pd_ctl", | |
| desc: "ADC PowerDown(PD) control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| fields: [ | |
| { bits: "0", | |
| name: "lp_mode", | |
| desc: "1'b0: adc_pd is disabled, use adc_sample_ctl. 1'b1: adc_pd is enabled, use both adc_lp_sample_ctl & adc_sample_ctl", | |
| resval: "0", | |
| } | |
| { bits: "7:4", | |
| name: "pwrup_time", | |
| desc: ''' | |
| ADC power up time, measured in always on clock cycles. | |
| After power up time is reached, the ADC controller needs one additional cycle before an ADC channel is selected for access. | |
| ''' | |
| resval: "6", | |
| } | |
| { bits: "31:8", | |
| name: "wakeup_time", | |
| desc: "How often FSM wakes up from ADC PD mode to take a sample, measured in always on clock cycles.", | |
| resval: "1600", | |
| } | |
| ] | |
| } | |
| { name: "adc_lp_sample_ctl", | |
| desc: "ADC Low-Power(LP) sample control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| fields: [ | |
| { bits: "7:0", | |
| name: "lp_sample_cnt", | |
| desc: ''' | |
| The number of samples in low-power mode when the low-power mode is enabled. | |
| After the programmed number is met, ADC won't be powered down any more. | |
| This value must be 1 or larger. | |
| ''', | |
| resval: "4", | |
| } | |
| ], | |
| } | |
| { name: "adc_sample_ctl", | |
| desc: "ADC sample control register", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| resval: "155", | |
| fields: [ | |
| { bits: "15:0", | |
| name: "np_sample_cnt", | |
| desc: ''' | |
| The number of samples in normal-power mode to meet the debounce spec. | |
| Used after the low-power mode condition is met or in the normal power mode. | |
| This value must be 1 or larger. | |
| ''', | |
| } | |
| ] | |
| } | |
| { name: "adc_fsm_rst", | |
| desc: "ADC FSM reset control", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "0", | |
| name: "rst_en", | |
| desc: "1'b0: Normal functional mode. 1'b1: SW to reset all the FSMs and timers", | |
| } | |
| ] | |
| } | |
| { multireg: { | |
| name: "adc_chn0_filter_ctl", | |
| desc: '''ADC channel0 filter range | |
| Up to 8 filters can be configured per channel and each filter has an associated [min, max] range. | |
| The condition bit then defines whether the sample values of that channel need to lie within the range or outside to create a match. | |
| The filter range bounds can be configured with a granularity of 2.148mV. | |
| ''', | |
| count: "NumAdcFilter", | |
| cname: "ADC_CTRL", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "11:2", | |
| name: "min_v", | |
| desc: "10-bit for chn0 filter min value ", | |
| } | |
| { bits: "12", | |
| name: "cond", | |
| desc: "1-bit for the condition; 1'b0 means min<=ADC<=max, 1'b1 means ADC>max or ADC<min ", | |
| } | |
| { bits: "27:18", | |
| name: "max_v", | |
| desc: "10-bit for chn0 filter max value ", | |
| }, | |
| { bits: "31", | |
| name: "EN", | |
| desc: "Enable for filter", | |
| } | |
| ], | |
| } | |
| } | |
| { multireg: { | |
| name: "adc_chn1_filter_ctl", | |
| desc: '''ADC channel1 filter range | |
| Up to 8 filters can be configured per channel and each filter has an associated [min, max] range. | |
| The condition bit then defines whether the sample values of that channel need to lie within the range or outside to create a match. | |
| The filter range bounds can be configured with a granularity of 2.148mV. | |
| ''', | |
| count: "NumAdcFilter", | |
| cname: "ADC_CTRL", | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "11:2", | |
| name: "min_v", | |
| desc: "10-bit for chn0 filter min value ", | |
| } | |
| { bits: "12", | |
| name: "cond", | |
| desc: "1-bit for the condition; 1'b0 means min<=ADC<=max, 1'b1 means ADC>max or ADC<min ", | |
| } | |
| { bits: "27:18", | |
| name: "max_v", | |
| desc: "10-bit for chn0 filter max value ", | |
| }, | |
| { bits: "31", | |
| name: "EN", | |
| desc: "Enable for filter", | |
| } | |
| ], | |
| } | |
| }, | |
| { multireg: { | |
| name: "adc_chn_val", | |
| desc: "ADC value sampled on channel", | |
| count: "NumAdcChannel", | |
| cname: "ADC_CTRL", | |
| swaccess: "ro", | |
| hwaccess: "hwo", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "1:0", | |
| name: "adc_chn_value_ext", | |
| desc: "2-bit extension; RO 0", | |
| } | |
| { bits: "11:2", | |
| name: "adc_chn_value", | |
| desc: "Latest ADC value sampled on channel. each step is 2.148mV", | |
| } | |
| { bits: "17:16", | |
| name: "adc_chn_value_intr_ext", | |
| desc: "2-bit extension; RO 0", | |
| } | |
| { bits: "27:18", | |
| name: "adc_chn_value_intr", | |
| desc: "ADC value sampled on channel when the interrupt is raised(debug cable is attached or disconnected), each step is 2.148mV", | |
| } | |
| ], | |
| } | |
| } | |
| { name: "adc_wakeup_ctl", | |
| desc: ''' | |
| Enable filter matches as wakeups | |
| ''', | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "NumAdcFilter-1:0", | |
| name: "EN", | |
| desc: "0: filter match wil not generate wakeupe; 1: filter match will generate wakeup", | |
| } | |
| ] | |
| } | |
| { name: "filter_status", | |
| desc: ''' | |
| Adc filter match status | |
| Indicates whether a particular filter has matched on all channels. | |
| ''', | |
| swaccess: "rw1c", | |
| hwaccess: "hrw", | |
| async: "clk_aon_i", | |
| resval: "0", | |
| fields: [ | |
| { bits: "7:0", | |
| name: "COND", | |
| desc: "0: filter condition is not met; 1: filter condition is met", | |
| } | |
| ] | |
| } | |
| { name: "adc_intr_ctl", | |
| desc: ''' | |
| Interrupt enable controls. | |
| adc_ctrl sends out only 1 interrupt, so this register controls | |
| which internal sources are actually registered. | |
| This register uses the same bit enumeration as !!ADC_INTR_STATUS | |
| ''', | |
| swaccess: "rw", | |
| hwaccess: "hro", | |
| resval: "0", | |
| fields: [ | |
| { bits: "8:0", | |
| name: "EN", | |
| desc: "0: interrupt source is not enabled; 1: interrupt source is enabled", | |
| } | |
| ] | |
| } | |
| { name: "adc_intr_status", | |
| desc: "Debug cable internal status", | |
| swaccess: "rw1c", | |
| hwaccess: "hrw", | |
| resval: "0", | |
| tags: [ // the value of these regs is determined by the | |
| // value on the pins, hence it cannot be predicted. | |
| "excl:CsrNonInitTests:CsrExclCheck"], | |
| fields: [ | |
| { bits: "NumAdcFilter-1:0", | |
| name: "filter_match", | |
| desc: "0: filter condition is not met; 1: filter condition is met", | |
| } | |
| { bits: "NumAdcFilter:NumAdcFilter", | |
| name: "oneshot", | |
| desc: "0: oneshot sample is not done ; 1: oneshot sample is done", | |
| } | |
| ] | |
| } | |
| ], | |
| } |