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

Subversion Repositories tv80

[/] [tv80/] [trunk/] [sc_env/] [app_localcfg/] [app_env_top.cpp] - Blame information for rev 104

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

Line No. Rev Author Line
1 104 ghutchis
#include "systemc.h"
2
#include "systemperl.h"
3
//#include "env_memory.h"
4
 
5
//#include "SpTraceVcd.h"
6
#include "verilated_vcd_sc.h"
7
#include <unistd.h>
8
#include "it_cfg_driver.h"
9
#include "it_cfg_monitor.h"
10
#include "Vlcfg.h"
11
#include "load_ihex.h"
12
 
13
extern char *optarg;
14
extern int optind, opterr, optopt;
15
 
16
#define FILENAME_SZ 80
17
#define MAX_MEM_SIZE 8192
18
 
19
int sc_main(int argc, char *argv[])
20
{
21
  bool dumping = false;
22
  bool memfile = false;
23
  int index;
24
  char dumpfile_name[FILENAME_SZ];
25
  char mem_src_name[FILENAME_SZ];
26
  uint8_t memory[MAX_MEM_SIZE];
27
  VerilatedVcdSc *tfp;
28
  //z80_decoder dec0 ("dec0");
29
 
30
  sc_clock clk("clk125", 8, SC_NS, 0.5);
31
 
32
  sc_signal<bool> reset_n;
33
  sc_signal<bool>  lcfg_init;
34
  sc_signal<bool>  lcfg_proc_reset;
35
 
36
  sc_signal<bool>      cfgi_irdy;
37
  sc_signal<bool>      cfgi_trdy;
38
  sc_signal<uint32_t>  cfgi_addr;
39
  sc_signal<bool>      cfgi_write;
40
  sc_signal<uint32_t>  cfgi_wr_data;
41
  sc_signal<uint32_t>  cfgi_rd_data;
42
 
43
  // outgoing config interface to system
44
  // configuration bus
45
  sc_signal<bool>      cfgo_irdy;
46
  sc_signal<bool>      cfgo_trdy;
47
  sc_signal<uint32_t>  cfgo_addr;
48
  sc_signal<bool>      cfgo_write;
49
  sc_signal<uint32_t>  cfgo_wr_data;
50
  sc_signal<uint32_t>  cfgo_rd_data;
51
 
52
  // clear program memory
53
  for (int i=0; i<MAX_MEM_SIZE; i++) memory[i] = 0;
54
 
55
  while ( (index = getopt(argc, argv, "d:i:k")) != -1) {
56
    printf ("DEBUG: getopt optind=%d index=%d char=%c\n", optind, index, (char) index);
57
    if  (index == 'd') {
58
      strncpy (dumpfile_name, optarg, FILENAME_SZ);
59
      dumping = true;
60
      printf ("VCD dump enabled to %s\n", dumpfile_name);
61
    } else if (index == 'i') {
62
      strncpy (mem_src_name, optarg, FILENAME_SZ);
63
      memfile = true;
64
    }
65
  }
66
 
67
  Vlcfg lcfg ("lcfg");
68
  lcfg.clk (clk);
69
  lcfg.reset_n(reset_n);
70
  lcfg.lcfg_init (lcfg_init);
71
  lcfg.lcfg_proc_reset (lcfg_proc_reset);
72
 
73
  lcfg.cfgi_irdy(cfgi_irdy);
74
  lcfg.cfgi_trdy(cfgi_trdy);
75
  lcfg.cfgi_addr(cfgi_addr);
76
  lcfg.cfgi_write(cfgi_write);
77
  lcfg.cfgi_rd_data(cfgi_rd_data);
78
  lcfg.cfgi_wr_data(cfgi_wr_data);
79
 
80
  lcfg.cfgo_irdy(cfgo_irdy);
81
  lcfg.cfgo_trdy(cfgo_trdy);
82
  lcfg.cfgo_addr(cfgo_addr);
83
  lcfg.cfgo_write(cfgo_write);
84
  lcfg.cfgo_rd_data(cfgo_rd_data);
85
  lcfg.cfgo_wr_data(cfgo_wr_data);
86
 
87
  it_cfg_driver driver ("driver");
88
  driver.clk (clk);
89
  driver.reset_n(reset_n);
90
 
91
  driver.cfgi_irdy(cfgi_irdy);
92
  driver.cfgi_trdy(cfgi_trdy);
93
  driver.cfgi_addr(cfgi_addr);
94
  driver.cfgi_write(cfgi_write);
95
  driver.cfgi_rd_data(cfgi_rd_data);
96
  driver.cfgi_wr_data(cfgi_wr_data);
97
 
98
  it_cfg_monitor monitor ("monitor");
99
  monitor.clk (clk);
100
  monitor.reset_n(reset_n);
101
 
102
  monitor.cfgo_irdy(cfgo_irdy);
103
  monitor.cfgo_trdy(cfgo_trdy);
104
  monitor.cfgo_addr(cfgo_addr);
105
  monitor.cfgo_write(cfgo_write);
106
  monitor.cfgo_rd_data(cfgo_rd_data);
107
  monitor.cfgo_wr_data(cfgo_wr_data);
108
 
109
 
110
  //env_memory env_memory0("env_memory0");
111
 
112
  // Start Verilator traces
113
  if (dumping) {
114
    Verilated::traceEverOn(true);
115
    tfp = new VerilatedVcdSc;
116
    lcfg.trace (tfp, 99);
117
    tfp->open (dumpfile_name);
118
  }
119
 
120
  // check for command line argument
121
  if (memfile) {
122
    int max, bused = 0;
123
    uint32_t cword;
124
    max = load_ihex (mem_src_name, memory, MAX_MEM_SIZE);
125
    printf ("Loading IHEX file %s, max addr=%d\n", mem_src_name, max);
126
    while (bused <= max) {
127
      cword = 0;
128
      for (int i=0; i<4; i++) cword |= (memory[bused++] << (i*8));
129
      printf ("Queueing %x\n", cword);
130
      driver.add_queue (cword);
131
    }
132
  }
133
 
134
  // set reset to 0 before sim start
135
  reset_n.write (0);
136
  lcfg_proc_reset.write(1);
137
 
138
  //sc_time *runtime = new sc_time(100, SC_NS);
139
  sc_time time100(100, SC_NS);
140
  sc_start(time100);
141
 
142
  reset_n.write (1);
143
 
144
  //delete runtime; runtime = new sc_time (1000, SC_NS);
145
  sc_start (sc_time(2500,SC_NS));
146
  lcfg_proc_reset.write(0);
147
 
148
  sc_start (sc_time(5000, SC_NS));
149
 
150
  /*
151
  sc_close_vcd_trace_file (trace_file);
152
  */
153
  if (dumping)
154
    tfp->close();
155
 
156
  return 0;
157
}

powered by: WebSVN 2.1.0

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