OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_synfull/] [dpi_interface.sv] - Blame information for rev 54

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 54 alirezamon
 
2
import pronoc_pkg::*;
3
import dpi_int_pkg::*;
4
 
5
 
6
localparam NE = 4*4*2 ;
7
 
8
module top_dpi_interface (
9
    input   logic               clk_i, rst_i  ,
10
    input   logic               init_i                          ,
11
    input   logic               startCom_i                      ,
12
    input   logic     [NE-1:0]  NE_ready_all_i                  ,
13
    input   deliver_t [NE-1:0]  pronoc_synfull_del_all_i        ,
14
    output  req_t     [NE-1:0]  synfull_pronoc_req_all_o        ,
15
    output  logic               endCom_o
16
);
17
 
18
 
19
import "DPI-C" function void c_dpi_interface (
20
    logic          startCom            ,
21
    logic          getData             ,
22
    logic          ejectReq            ,
23
    logic          queueReq            ,
24
    output  logic  endCom              ,
25
    output  logic  newReq              ,
26
    output  int    source_all[NE]      ,
27
    output  int    destination_all[NE] ,
28
    output  int    address_all[NE]     ,
29
    output  int    opcode_all[NE]      ,
30
    output  int    id_all[NE]          ,
31
    output  int    valid_all[NE]       ,
32
    input   int    rtrn_pkgid_all[NE]  ,
33
    input   int    rtrn_valid_all[NE]  ,
34
    input   int    NEready_all[NE]     ,
35
    output  int    size_all[NE]        ,
36
    input   int    enqueue_valid[NE]   ,
37
    input   int    enqueue_src[NE]     ,
38
    input   int    enqueue_dst[NE]     ,
39
    input   int    enqueue_id[NE]      ,
40
    input   int    enqueue_size[NE]
41
);
42
 
43
import "DPI-C" function void connection_init(
44
    logic           startCom     ,
45
    output logic    ready
46
);
47
 
48
int destination ;
49
int opcode      ;
50
int source      ;
51
int addr        ;
52
int pkgid       ;
53
int NEready_all[NE]             ;
54
int syn_source_all[NE]          ;
55
int syn_size_all[NE]            ;
56
int syn_opcode_all[NE]          ;
57
int syn_destination_all[NE]     ;
58
int syn_address_all[NE]         ;
59
int syn_pkgid_all[NE]           ;
60
int syn_valid_all[NE]           ;
61
int chi_req_pkgid_all[NE]       ;
62
int chi_req_valid_all[NE]       ;
63
 
64
int enqueue_valid[NE];
65
int enqueue_src[NE]  ;
66
int enqueue_dst[NE]  ;
67
int enqueue_id[NE]   ;
68
int enqueue_size[NE] ;
69
 
70
int _enqueue_valid[NE];
71
int _enqueue_src[NE]  ;
72
int _enqueue_dst[NE]  ;
73
int _enqueue_id[NE]   ;
74
int _enqueue_size[NE] ;
75
 
76
logic newData             ;
77
logic newReq              ;
78
logic ready_connection    ;
79
logic eject_req           ;
80
logic queue_req           ;
81
logic endCom              ;
82
 
83
logic [NE-1:0] valid_check ;
84
logic [NE-1:0] queue_check ;
85
 
86
// socket connection
87
always_ff @(posedge clk_i) begin
88
    connection_init(
89
        init_i,ready_connection
90
    );
91
end
92
 
93
// trace injection
94
always_ff @(posedge clk_i) begin
95
    c_dpi_interface(
96
        startCom_i&ready_connection ,
97
        clk_i                       ,
98
        eject_req                   ,
99
        queue_req                   ,
100
        endCom_o                    ,
101
        newData                     ,
102
        syn_source_all              ,
103
        syn_destination_all         ,
104
        syn_address_all             ,
105
        syn_opcode_all              ,
106
        syn_pkgid_all               ,
107
        syn_valid_all               ,
108
        chi_req_pkgid_all           ,
109
        chi_req_valid_all           ,
110
        NEready_all                 ,
111
        syn_size_all                ,
112
        enqueue_valid               ,
113
        enqueue_src                 ,
114
        enqueue_dst                 ,
115
        enqueue_id                  ,
116
        enqueue_size
117
    );
118
end
119
 
120
genvar k;
121
generate
122
for(k=0;k
123
    //to pronoc
124
    assign synfull_pronoc_req_all_o[k].dest  = syn_destination_all[k];
125
    assign synfull_pronoc_req_all_o[k].size  = syn_size_all[k];
126
    assign synfull_pronoc_req_all_o[k].src   = syn_source_all[k];
127
    assign synfull_pronoc_req_all_o[k].id    = syn_pkgid_all[k];
128
    assign synfull_pronoc_req_all_o[k].valid = syn_valid_all[k][0] & NE_ready_all_i[k] ;
129
 
130
    //from pronoc
131
    assign chi_req_pkgid_all[k]       = pronoc_synfull_del_all_i[k].id       ;
132
    assign chi_req_valid_all[k]       = pronoc_synfull_del_all_i[k].valid    ;
133
    assign NEready_all[k]             = NE_ready_all_i[k]                    ;
134
 
135
    assign valid_check[k] = pronoc_synfull_del_all_i[k].valid;
136
    assign queue_check[k] = (syn_valid_all[k][0] & !NE_ready_all_i[k]);
137
 
138
 
139
    //to enqueue
140
    assign enqueue_valid[k] = (syn_valid_all[k][0] & !NE_ready_all_i[k]) ? 1 : 0  ;
141
    assign enqueue_src[k]   = syn_source_all[k]                         ;
142
    assign enqueue_dst[k]   = syn_destination_all[k]                    ;
143
    assign enqueue_id[k]    = syn_pkgid_all[k]                          ;
144
    assign enqueue_size[k]  = syn_size_all[k]                           ;
145
 
146
     //always @* begin
147
     //    if(syn_valid_all[k][0] & !NE_ready_all_i[k]) begin
148
     //        $display ("not injected because the router injector is not ready: %d", syn_pkgid_all[k]);
149
     //    end
150
     //end
151
end
152
endgenerate
153
 
154
assign eject_req = !(valid_check=='0);
155
assign queue_req = !(queue_check=='0);
156
 
157
 
158
always_ff @ (posedge clk_i) begin
159
    if (!rst_i) begin
160
        _enqueue_valid <= '{default:'0} ;
161
        _enqueue_src   <= '{default:'0} ;
162
        _enqueue_dst   <= '{default:'0} ;
163
        _enqueue_id    <= '{default:'0} ;
164
        _enqueue_size  <= '{default:'0} ;
165
    end
166
    else begin
167
        _enqueue_valid <= enqueue_valid ;
168
        _enqueue_src   <= enqueue_src   ;
169
        _enqueue_dst   <= enqueue_dst   ;
170
        _enqueue_id    <= enqueue_id    ;
171
        _enqueue_size  <= enqueue_size  ;
172
    end
173
end
174
 
175
 
176
 
177
 
178
 
179
 
180
 
181
 
182
 
183
 
184
endmodule

powered by: WebSVN 2.1.0

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