OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [src/] [core/] [scr1_dmi.sv] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 dinesha
/// Copyright by Syntacore LLC © 2016-2020. See LICENSE for details
2
/// @file       
3
/// @brief      Debug Module Interface (DMI)
4
///
5
 
6
//------------------------------------------------------------------------------
7
 //
8
 // Functionality:
9
 // - Provides TAPC with access to Debug Module (DM) and DTMCS
10
 //
11
 // Structure:
12
 // - DMI <-> TAP interface
13
 // - DMI <-> DM interface
14
 //
15
//------------------------------------------------------------------------------
16
 
17
`include "scr1_arch_description.svh"
18
 
19
`ifdef SCR1_DBG_EN
20
`include "scr1_dm.svh"
21
 
22
module scr1_dmi (
23
    // System
24
    input  logic                                    rst_n,                      // DMI unit reset
25
    input  logic                                    clk,                        // DMI unit clock
26
 
27
    // TAP interface
28
    input  logic                                    tapcsync2dmi_ch_sel_i,      // Debug Transport Module Chain Select
29
    input  logic [SCR1_DBG_DMI_CH_ID_WIDTH-1:0]     tapcsync2dmi_ch_id_i,       // Debug Transport Module Chain ID
30
    input  logic                                    tapcsync2dmi_ch_capture_i,  // Debug Transport Module Chain Capture
31
    input  logic                                    tapcsync2dmi_ch_shift_i,    // Debug Transport Module Chain Shift
32
    input  logic                                    tapcsync2dmi_ch_update_i,   // Debug Transport Module Chain Update
33
    input  logic                                    tapcsync2dmi_ch_tdi_i,      // Debug Transport Module Chain TDI
34
    output logic                                    dmi2tapcsync_ch_tdo_o,      // Debug Transport Module Chain TDO
35
 
36
    // DM interface
37
    input logic                                     dm2dmi_resp_i,              // DMI response
38
    input logic [SCR1_DBG_DMI_DATA_WIDTH-1:0]       dm2dmi_rdata_i,             // DMI read data
39
    output logic                                    dmi2dm_req_o,               // DMI request
40
    output logic                                    dmi2dm_wr_o,                // DMI write
41
    output logic [SCR1_DBG_DMI_ADDR_WIDTH-1:0]      dmi2dm_addr_o,              // DMI address
42
    output logic [SCR1_DBG_DMI_DATA_WIDTH-1:0]      dmi2dm_wdata_o              // DMI write data
43
);
44
 
45
//------------------------------------------------------------------------------
46
// Local parameters declaration
47
//------------------------------------------------------------------------------
48
 
49
// Debug Transport Module Status parameters
50
//------------------------------------------------------------------------------
51
 
52
localparam    DTMCS_RESERVEDB_HI = 5'd31;
53
localparam    DTMCS_RESERVEDB_LO = 5'd18;
54
localparam    DTMCS_DMIHARDRESET = 5'd17;
55
localparam    DTMCS_DMIRESET     = 5'd16;
56
localparam    DTMCS_RESERVEDA    = 5'd15;
57
localparam    DTMCS_IDLE_HI      = 5'd14;
58
localparam    DTMCS_IDLE_LO      = 5'd12;
59
localparam    DTMCS_DMISTAT_HI   = 5'd11;
60
localparam    DTMCS_DMISTAT_LO   = 5'd10;
61
localparam    DTMCS_ABITS_HI     = 5'd9;
62
localparam    DTMCS_ABITS_LO     = 5'd4;
63
localparam    DTMCS_VERSION_HI   = 5'd3;
64
localparam    DTMCS_VERSION_LO   = 5'd0;
65
 
66
// Debug Module Interface parameters
67
//------------------------------------------------------------------------------
68
 
69
localparam    DMI_OP_LO   = 5'd0;
70
localparam    DMI_OP_HI   = DMI_OP_LO   + SCR1_DBG_DMI_OP_WIDTH   - 1;
71
localparam    DMI_DATA_LO = DMI_OP_HI   + 1;
72
localparam    DMI_DATA_HI = DMI_DATA_LO + SCR1_DBG_DMI_DATA_WIDTH - 1;
73
localparam    DMI_ADDR_LO = DMI_DATA_HI + 1;
74
localparam    DMI_ADDR_HI = DMI_ADDR_LO + SCR1_DBG_DMI_ADDR_WIDTH - 1;
75
 
76
//------------------------------------------------------------------------------
77
// Local signals declaration
78
//------------------------------------------------------------------------------
79
 
80
// TAP data register
81
logic                                               tap_dr_upd;
82
logic [SCR1_DBG_DMI_DR_DMI_ACCESS_WIDTH-1:0]        tap_dr_ff;
83
logic [SCR1_DBG_DMI_DR_DMI_ACCESS_WIDTH-1:0]        tap_dr_shift;
84
logic [SCR1_DBG_DMI_DR_DMI_ACCESS_WIDTH-1:0]        tap_dr_rdata;
85
logic [SCR1_DBG_DMI_DR_DMI_ACCESS_WIDTH-1:0]        tap_dr_next;
86
 
87
// DM read data register
88
logic                                               dm_rdata_upd;
89
logic [SCR1_DBG_DMI_DATA_WIDTH-1:0]                 dm_rdata_ff;
90
 
91
logic                                               tapc_dmi_access_req;
92
logic                                               tapc_dtmcs_sel;
93
 
94
//------------------------------------------------------------------------------
95
// DMI <-> TAP interface
96
//------------------------------------------------------------------------------
97
 
98
// TAPC read data multiplexer
99
//------------------------------------------------------------------------------
100
 
101
assign tapc_dtmcs_sel = (tapcsync2dmi_ch_id_i == 1'd1);
102
 
103
// DMI operation is always successful in the current implementation
104
always_comb begin
105
    tap_dr_rdata = '0;
106
 
107
    if(tapc_dtmcs_sel) begin
108
        tap_dr_rdata[DTMCS_RESERVEDB_HI:DTMCS_RESERVEDB_LO] = 'b0;
109
        tap_dr_rdata[DTMCS_DMIHARDRESET]                    = 'b0;
110
        tap_dr_rdata[DTMCS_DMIRESET]                        = 'b0;
111
        tap_dr_rdata[DTMCS_RESERVEDA]                       = 'b0;
112
        tap_dr_rdata[DTMCS_IDLE_HI:DTMCS_IDLE_LO]           = 'b0;
113
        tap_dr_rdata[DTMCS_DMISTAT_HI:DTMCS_DMISTAT_LO]     = 'b0;
114
        tap_dr_rdata[DTMCS_ABITS_HI  :DTMCS_ABITS_LO]       = SCR1_DBG_DMI_ADDR_WIDTH;
115
        tap_dr_rdata[DTMCS_VERSION_LO]                      = 1'b1;
116
    end else begin
117
        tap_dr_rdata[DMI_ADDR_HI:DMI_ADDR_LO]               = 'b0;
118
        tap_dr_rdata[DMI_DATA_HI:DMI_DATA_LO]               = dm_rdata_ff;
119
        tap_dr_rdata[DMI_OP_HI  :DMI_OP_LO]                 = 'b0;
120
    end
121
end
122
 
123
assign tap_dr_shift = tapc_dtmcs_sel
124
                    ? {9'b0, tapcsync2dmi_ch_tdi_i, tap_dr_ff[SCR1_DBG_DMI_DR_DTMCS_WIDTH-1:1]}
125
                    : {tapcsync2dmi_ch_tdi_i, tap_dr_ff[SCR1_DBG_DMI_DR_DMI_ACCESS_WIDTH-1:1]};
126
 
127
// TAP data register
128
//------------------------------------------------------------------------------
129
 
130
assign tap_dr_upd = tapcsync2dmi_ch_capture_i | tapcsync2dmi_ch_shift_i;
131
 
132
always_ff @(posedge clk, negedge rst_n) begin
133
    if (~rst_n) begin
134
        tap_dr_ff <= '0;
135
    end else if(tap_dr_upd) begin
136
        tap_dr_ff <= tap_dr_next;
137
    end
138
end
139
 
140
assign tap_dr_next = tapcsync2dmi_ch_capture_i ? tap_dr_rdata
141
                   : tapcsync2dmi_ch_shift_i   ? tap_dr_shift
142
                                               : tap_dr_ff;
143
 
144
assign dmi2tapcsync_ch_tdo_o = tap_dr_ff[0];
145
 
146
//------------------------------------------------------------------------------
147
// DMI <-> DM interface
148
//------------------------------------------------------------------------------
149
 
150
assign tapc_dmi_access_req = tapcsync2dmi_ch_update_i & tapcsync2dmi_ch_sel_i
151
                           & (tapcsync2dmi_ch_id_i == 2'd2);
152
 
153
always_comb begin
154
    dmi2dm_req_o           = 1'b0;
155
    dmi2dm_wr_o            = 1'b0;
156
    dmi2dm_addr_o          = 1'b0;
157
    dmi2dm_wdata_o         = 1'b0;
158
 
159
    if(tapc_dmi_access_req) begin
160
        dmi2dm_req_o   = tap_dr_ff[DMI_OP_HI  :DMI_OP_LO] != 2'b00;
161
        dmi2dm_wr_o    = tap_dr_ff[DMI_OP_HI  :DMI_OP_LO] == 2'b10;
162
        dmi2dm_addr_o  = tap_dr_ff[DMI_ADDR_HI:DMI_ADDR_LO];
163
        dmi2dm_wdata_o = tap_dr_ff[DMI_DATA_HI:DMI_DATA_LO];
164
    end
165
end
166
 
167
// DM read data register
168
//------------------------------------------------------------------------------
169
 
170
assign dm_rdata_upd = dmi2dm_req_o & dm2dmi_resp_i & ~dmi2dm_wr_o;
171
 
172
always_ff @(posedge clk, negedge rst_n) begin
173
    if (~rst_n) begin
174
        dm_rdata_ff <= '0;
175
    end else if (dm_rdata_upd) begin
176
        dm_rdata_ff <= dm2dmi_rdata_i;
177
    end
178
end
179
 
180
endmodule : scr1_dmi
181
 
182
`endif // SCR1_DBG_EN

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.