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

Subversion Repositories axi4_tlm_bfm

[/] [axi4_tlm_bfm/] [trunk/] [rtl/] [vivado-synthesis/] [axi4-stream-bfm-master.vhdl] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 21 daniel.kho
--/*
2
--      This file is part of the AXI4 Transactor and Bus Functional Model 
3
--      (axi4_tlm_bfm) project:
4
--              http://www.opencores.org/project,axi4_tlm_bfm
5
 
6
--      Description
7
--      Implementation of AXI4 Master BFM core according to AXI4 protocol 
8
--      specification document.
9
 
10
--      To Do: Implement AXI4-Lite and full AXI4 protocols.
11
 
12
--      Author(s): 
13
--      - Daniel C.K. Kho, daniel.kho@opencores.org | daniel.kho@tauhop.com
14
 
15
--      Copyright (C) 2012-2013 Authors and OPENCORES.ORG
16
 
17
--      This source file may be used and distributed without 
18
--      restriction provided that this copyright statement is not 
19
--      removed from the file and that any derivative work contains 
20
--      the original copyright notice and the associated disclaimer.
21
 
22
--      This source file is free software; you can redistribute it 
23
--      and/or modify it under the terms of the GNU Lesser General 
24
--      Public License as published by the Free Software Foundation; 
25
--      either version 2.1 of the License, or (at your option) any 
26
--      later version.
27
 
28
--      This source is distributed in the hope that it will be 
29
--      useful, but WITHOUT ANY WARRANTY; without even the implied 
30
--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
31
--      PURPOSE. See the GNU Lesser General Public License for more 
32
--      details.
33
 
34
--      You should have received a copy of the GNU Lesser General 
35
--      Public License along with this source; if not, download it 
36
--      from http://www.opencores.org/lgpl.shtml.
37
--*/
38
library ieee; use ieee.std_logic_1164.all, ieee.numeric_std.all;
39
--library tauhop; use tauhop.axiTransactor.all;
40
 
41
--/* TODO remove once generic packages are supported. */
42
library tauhop; use tauhop.tlm.all, tauhop.axiTLM.all;
43
 
44
entity axiBfmMaster is
45
        port(aclk,n_areset:in std_ulogic;
46
--              /* BFM signalling. */
47
                readRequest,writeRequest:in t_bfm:=((others=>'X'),(others=>'X'),false);
48
                readResponse,writeResponse:buffer t_bfm;                                                                        -- use buffer until synthesis tools support reading from out ports.
49
 
50
--              /* AXI Master interface */
51
                axiMaster_in:in t_axi4StreamTransactor_s2m;
52
                axiMaster_out:buffer t_axi4StreamTransactor_m2s;
53
 
54
--              /* AXI Slave interface */
55
--              axiSlave_in:in tAxi4Transactor_m2s;
56
--              axiSlave_out:buffer tAxi4Transactor_s2m;
57
 
58
                symbolsPerTransfer:in t_cnt;
59
                outstandingTransactions:buffer t_cnt;
60
 
61
--              /* Debug ports. */
62
--              dbg_cnt:out unsigned(9 downto 0);
63
--              dbg_axiRxFsm:out axiBfmStatesRx:=idle;
64
                dbg_axiTxFsm:out axiBfmStatesTx:=idle
65
        );
66
end entity axiBfmMaster;
67
 
68
architecture rtl of axiBfmMaster is
69
--      /* Finite-state Machines. */
70
        signal axiTxState,next_axiTxState:axiBfmStatesTx:=idle;
71
 
72
--      /* BFM signalling. */
73
        signal i_readRequest:t_bfm:=((others=>'0'),(others=>'0'),false);
74
        signal i_writeRequest:t_bfm:=((others=>'0'),(others=>'0'),false);
75
 
76
        signal i_readResponse,i_writeResponse:t_bfm;
77
 
78
begin
79
--      /* Transaction counter. */
80
        process(n_areset,symbolsPerTransfer,aclk) is begin
81
                --if not n_areset then outstandingTransactions<=symbolsPerTransfer;
82
                if falling_edge(aclk) then
83
--                      /* Use synchronous reset for outstandingTransactions to meet timing because it is a huge register set. */
84
                        if not n_areset then outstandingTransactions<=symbolsPerTransfer;
85
                        else
86
                                if outstandingTransactions<1 then
87
                                        outstandingTransactions<=symbolsPerTransfer;
88
                                        report "No more pending transactions." severity note;
89
                                elsif axiMaster_in.tReady then outstandingTransactions<=outstandingTransactions-1;
90
                                end if;
91
                        end if;
92
                end if;
93
        end process;
94
 
95
--      /* next-state logic for AXI4-Stream Master Tx BFM. */
96
        axi_bfmTx_ns: process(all) is begin
97
                axiTxState<=next_axiTxState;
98
 
99
                if not n_areset then axiTxState<=idle;
100
                else
101
                        case next_axiTxState is
102
                                when idle=>
103
                                        if writeRequest.trigger xor i_writeRequest.trigger then axiTxState<=payload; end if;
104
                                when payload=>
105
                                        if outstandingTransactions<1 then axiTxState<=endOfTx; end if;
106
                                when endOfTx=>
107
                                        axiTxState<=idle;
108
                                when others=>axiTxState<=idle;
109
                        end case;
110
                end if;
111
        end process axi_bfmTx_ns;
112
 
113
--      /* output logic for AXI4-Stream Master Tx BFM. */
114
        axi_bfmTx_op: process(all) is begin
115
                i_writeResponse<=writeResponse;
116
 
117
                axiMaster_out.tValid<=false;
118
                axiMaster_out.tLast<=false;
119
                axiMaster_out.tData<=(others=>'Z');
120
                i_writeResponse.trigger<=false;
121
 
122
                if writeRequest.trigger xor i_writeRequest.trigger then
123
                        axiMaster_out.tData<=writeRequest.message;
124
                        axiMaster_out.tValid<=true;
125
                end if;
126
 
127
                if not n_areset then axiMaster_out.tData<=(others=>'Z');
128
                else
129
                        case next_axiTxState is
130
                                when payload=>
131
                                        axiMaster_out.tData<=writeRequest.message;
132
                                        axiMaster_out.tValid<=true;
133
 
134
                                        if axiMaster_in.tReady then
135
                                                i_writeResponse.trigger<=true;
136
                                        end if;
137
 
138
--                                      /* TODO change to a flag at user.vhdl. Move outstandingTransactions to user.vhdl. */
139
                                        if outstandingTransactions<1 then axiMaster_out.tLast<=true; end if;
140
                                when others=> null;
141
                        end case;
142
                end if;
143
        end process axi_bfmTx_op;
144
 
145
--      /* state registers and pipelines for AXI4-Stream Tx BFM. */
146
        process(n_areset,aclk) is begin
147
                if falling_edge(aclk) then
148
                        next_axiTxState<=axiTxState;
149
                        i_writeRequest<=writeRequest;
150
                end if;
151
        end process;
152
 
153
        process(aclk) is begin
154
                if rising_edge(aclk) then
155
                        writeResponse<=i_writeResponse;
156
                end if;
157
        end process;
158
 
159
        dbg_axiTxFSM<=axiTxState;
160
end architecture rtl;

powered by: WebSVN 2.1.0

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