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

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [src/] [core/] [scr1_tapc_shift_reg.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      TAPC shift register. Parameterized implementation of JTAG TAPC's Shift Register.
4
///
5
 
6
`include "scr1_arch_description.svh"
7
 
8
`ifdef SCR1_DBG_EN
9
module scr1_tapc_shift_reg #(
10
    parameter   int unsigned            SCR1_WIDTH       = 8,   // Register width, bits
11
    parameter   logic [SCR1_WIDTH-1:0]  SCR1_RESET_VALUE = '0   // Register's value after reset
12
) (
13
    input  logic                    clk,            // Clock
14
    input  logic                    rst_n,          // Async reset
15
    input  logic                    rst_n_sync,     // Sync reset
16
                                                    // TAP FSM's control signals:
17
    input  logic                    fsm_dr_select,  //   - for this DR selection (operation enabling);
18
    input  logic                    fsm_dr_capture, //   - to capture parallel input's data into shift register;
19
    input  logic                    fsm_dr_shift,   //   - to enable data shifting;
20
                                                    // Inputs:
21
    input  logic                    din_serial,     //   - serial (shift_reg[msb/SCR1_WIDTH]);
22
    input  logic [SCR1_WIDTH-1:0]   din_parallel,   //   - parallel (shift register's input).
23
                                                    // Outputs:
24
    output logic                    dout_serial,    //   - serial (shift_reg[0]);
25
    output logic [SCR1_WIDTH-1:0]   dout_parallel   //   - parallel (shift register's output).
26
);
27
 
28
//-------------------------------------------------------------------------------
29
// Local signals declaration
30
//-------------------------------------------------------------------------------
31
logic [SCR1_WIDTH-1:0]   shift_reg;
32
 
33
//-------------------------------------------------------------------------------
34
// Shift register
35
//-------------------------------------------------------------------------------
36
generate
37
    if (SCR1_WIDTH > 1)
38
    begin : dr_shift_reg
39
 
40
        always_ff @(posedge clk, negedge rst_n)
41
        begin
42
            if (~rst_n) begin
43
                shift_reg <= SCR1_RESET_VALUE;
44
            end
45
            else if (~rst_n_sync) begin
46
                shift_reg <= SCR1_RESET_VALUE;
47
            end
48
            else if (fsm_dr_select & fsm_dr_capture) begin
49
                shift_reg <= din_parallel;
50
            end
51
            else if (fsm_dr_select & fsm_dr_shift) begin
52
                shift_reg <= {din_serial, shift_reg[SCR1_WIDTH-1:1]};
53
            end
54
        end
55
 
56
    end
57
    else begin : dr_shift_reg
58
 
59
        always_ff @(posedge clk, negedge rst_n)
60
        begin
61
            if (~rst_n) begin
62
                shift_reg <= SCR1_RESET_VALUE;
63
            end
64
            else if (~rst_n_sync) begin
65
                shift_reg <= SCR1_RESET_VALUE;
66
            end
67
            else if (fsm_dr_select & fsm_dr_capture) begin
68
                shift_reg <= din_parallel;
69
            end
70
            else if (fsm_dr_select & fsm_dr_shift) begin
71
                shift_reg <= din_serial;
72
            end
73
        end
74
 
75
    end
76
endgenerate
77
 
78
//-------------------------------------------------------------------------------
79
// Parallel output
80
//-------------------------------------------------------------------------------
81
assign dout_parallel = shift_reg;
82
 
83
//-------------------------------------------------------------------------------
84
// Serial output
85
//-------------------------------------------------------------------------------
86
assign dout_serial = shift_reg[0];
87
 
88
`ifdef SCR1_TRGT_SIMULATION
89
//-------------------------------------------------------------------------------
90
// Assertion
91
//-------------------------------------------------------------------------------
92
 
93
// X checks
94
SCR1_SVA_TAPC_SHIFTREG_XCHECK : assert property (
95
    @(negedge clk) disable iff (~rst_n)
96
    !$isunknown({
97
        rst_n_sync,
98
        fsm_dr_select,
99
        fsm_dr_capture,
100
        fsm_dr_shift,
101
        din_serial,
102
        din_parallel
103
    })
104
) else begin
105
    $error("TAPC Shift Reg error: unknown values");
106
end
107
 
108
`endif // SCR1_TRGT_SIMULATION
109
 
110
endmodule : scr1_tapc_shift_reg
111
 
112
`endif // SCR1_DBG_EN

powered by: WebSVN 2.1.0

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