summaryrefslogtreecommitdiff
path: root/rtl/mp.sv
blob: a8ffee42aea404a0808928d7fd7363046d976918 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
module mp
(
    input  logic clk,
                 rst_n,
    
    // todas las señales de shutdown_request de otros procesadores
    input  logic [1:0] avl_address,
	input  logic       avl_read,
	                   avl_write,
	input  logic[31:0] avl_writedata,
    output logic[31:0] avl_readdata,

    input logic       cpu_halted_pe_0,
                      cpu_halted_pe_1,
                      cpu_halted_pe_2,
                      cpu_halted_pe_3,
	input logic       breakpoint_pe_0,
                      breakpoint_pe_1,
                      breakpoint_pe_2,
                      breakpoint_pe_3,    

    // señales de halt 
    output logic      halt_pe_0,
                      halt_pe_1,
                      halt_pe_2,
                      halt_pe_3,
                      step_pe_0,
                      step_pe_1,
                      step_pe_2,
                      step_pe_3
);

    logic[7:0] pe_status;
    logic halt, step, run;

    assign {step, run, halt} = avl_writedata[2:0];
    assign avl_readdata = {24'b0, pe_status};

    always @(posedge clk or negedge rst_n)
        if(!rst_n) begin
            halt_pe_0 <= 0; //Encender solo el PE0
            halt_pe_1 <= 1;
            halt_pe_2 <= 1;
            halt_pe_3 <= 1;
            step_pe_1 <= 0;
            step_pe_2 <= 0;
            step_pe_3 <= 0;
            step_pe_4 <= 0;
            pe_status <= {($bits(pe_status)){1'b0}};
        end else begin

            pe_status <= { cpu_halted_pe_0,
        	               breakpoint_pe_0,
                           cpu_halted_pe_1,
                           breakpoint_pe_1,
                           cpu_halted_pe_2,
                           breakpoint_pe_2,
                           cpu_halted_pe_3,
                           breakpoint_pe_3 };

            unique case(avl_address)
                2'b00: begin
                    //Se hace halt hasta el siguiente ciclo después de que se 
                    //solicita el breakpoint
                    halt_pe_0 <= (halt_pe_0 || halt || breakpoint_pe_0) && !run && !step;
                    step_pe_0 <= !breakpoint_pe_0 || step;
                end
                2'b01: begin
                    halt_pe_1 <= ((halt_pe_1 || halt) && !run) || breakpoint_pe_1 || !step;
                    step_pe_1 <= !breakpoint_pe_1 || step;
                end
                2'b10: begin
                    halt_pe_2 <= ((halt_pe_2 || halt) && !run) || breakpoint_pe_2 || !step;
                    step_pe_2 <= !breakpoint_pe_2 || step;
                end
                2'b11: begin
                    halt_pe_3 <= ((halt_pe_3 || halt) && !run) || breakpoint_pe_3 || !step;
                    step_pe_3 <= !breakpoint_pe_3 || step;
                end      
            endcase
        end

endmodule