APB_mod - EDA Playground
Warning! This exercise has been opened in another tab; autosave has been disabled. Close this tab or refresh to reactivate.

 Languages & Libraries

 Tools & Simulators

 Examples

208


601
 
1
`include "uvm_macros.svh"
2
import uvm_pkg::*;
3
4
//////////////////////transaction class//////////////////////
5
class transaction extends uvm_sequence_item;
6
  `uvm_object_utils( transaction )
7
  
8
    bit     [7 : 0]    paddr;
9
    bit     [7 : 0]    pwdata;
10
    bit                pwrite;
11
    bit     [7 : 0]    prdata;
12
  
13
    function new(string name = "transaction");
14
       super.new(name);
15
    endfunction 
16
  
17
    /***constraint c_paddr { 
18
      paddr inside {8'hF0, 8'hE0, 8'hE1, 8'hE2, 8'hE3, 8'hD0, 8'hD1, 8'hD2, 8'hD3};
19
    }***/
20
  
21
    /*** constraint c_paddr { 
22
      paddr inside {8'hF0};
23
    } ***/
24
25
endclass
26
27
//////////////////////Driver//////////////////////
28
class driver extends uvm_driver #(transaction);
29
    `uvm_component_utils(driver)
30
  
31
  virtual top_if vif;
32
  transaction tr;
33
  
34
  function new(string name = "driver", uvm_component parent = null);
35
        super.new(name, parent);
36
   endfunction  
37
  
38
    virtual function void build_phase(uvm_phase phase);
39
        super.build_phase(phase);
40
      if(!uvm_config_db#(virtual top_if)::get(this, "", "vif", vif))
41
        `uvm_error("DRV", "Error getting Interface Handle")
42
    endfunction 
43
        
44
    /////write data to dut  -> psel -> pen 
45
        
46
    virtual task write();
47
      vif.presetn <=0;
48
      #5 vif.presetn <=1;
49
        @(posedge vif.pclk);
50
        vif.paddr   <= tr.paddr;
51
        vif.pwdata  <= tr.pwdata;
52
        vif.pwrite  <= 1'b1;
53
        vif.psel    <= 1'b1;
54
55
        @(posedge vif.pclk);
56
        vif.penable <= 1'b1;
57
      
58
        //@(posedge vif.pclk);
59
        //vif.pwrite  <= 1'b1;
60
61
      `uvm_info("DRV", $sformatf("Mode :Write | WDATA : %0d ADDR : %0d", vif.pwdata, vif.paddr), UVM_NONE);      
62
   
63
         @(posedge vif.pclk);
64
        vif.psel    <= 1'b0;
65
        vif.penable <= 1'b0;
66
    endtask 
67
      
68
     ////read data from dut 
69
    virtual task read();
70
        @(posedge vif.pclk);
71
        vif.paddr   <= tr.paddr;
72
        vif.pwrite  <= 1'b0;
73
        vif.psel    <= 1'b1;
74
75
        @(posedge vif.pclk);
76
        vif.penable <= 1'b1;
77
78
        //@(posedge vif.pclk);
79
        //vif.pwrite  <= 1'b0;
80
81
        @(posedge vif.pclk);
82
        vif.psel    <= 1'b0;
83
        vif.penable <= 1'b0;
84
        tr.prdata   = vif.prdata;
85
86
        `uvm_info("DRV", $sformatf("Mode :Read | WDATA : %0d ADDR : %0d RDATA : %0d", vif.pwdata, vif.paddr, vif.prdata), UVM_NONE);
87
88
    endtask 
89
      
90
    /////////////////////////////////////////
91
      
92
    virtual task run_phase (uvm_phase phase);
93
      bit [7:0] data;
94
        vif.presetn <= 1'b1;
95
        vif.psel <= 0;
96
        vif.penable <= 0;
97
        vif.pwrite <= 0;
98
        vif.paddr <= 0;
99
        vif.pwdata <= 0;
100
      
101
        forever begin
102
          seq_item_port.get_next_item (tr);
103
          if (tr.pwrite)
104
            begin
105
               write();
106
            end
107
            else 
108
            begin   
109
               read();
110
            end
111
            seq_item_port.item_done ();
112
        end
113
    endtask  
114
endclass
115
      
116
      
117
      
118
//////////////////////Monitor//////////////////////
119
class monitor extends uvm_monitor;
120
    `uvm_component_utils( monitor )
121
122
    uvm_analysis_port   #(transaction)  mon_ap;
123
    virtual     top_if              vif;
124
    
125
    function new(string name="my_monitor", uvm_component parent);
126
        super.new(name, parent);
127
    endfunction : new
128
  
129
    virtual function void build_phase(uvm_phase phase);
130
        super.build_phase (phase);
131
        mon_ap = new("mon_ap", this);
132
      if(! uvm_config_db#(virtual top_if)::get (this, "", "vif", vif))
133
            `uvm_error("DRV", "Error getting Interface Handle")
134
    endfunction : build_phase
135
  
136
    virtual task run_phase(uvm_phase phase);
137
        fork
138
            forever begin
139
               @(posedge vif.pclk);
140
                if(vif.psel && vif.penable && vif.presetn) begin
141
                  transaction tr = transaction::type_id::create("tr");
142
                  tr.paddr  = vif.paddr;
143
                  tr.pwrite = vif.pwrite;
144
                    if (vif.pwrite)
145
                       begin
146
                        tr.pwdata = vif.pwdata;
147
                        @(posedge vif.pclk);
148
                         `uvm_info("MON", $sformatf("Mode : Write | WDATA : %0d ADDR : %0d", vif.pwdata, vif.paddr), UVM_NONE);
149
                       end
150
                    else
151
                       begin
152
                         @(posedge vif.pclk);
153
                        tr.prdata = vif.prdata;
154
                         `uvm_info("MON", $sformatf("Mode : Read | WDATA : %0d ADDR : %0d RDATA : %0d", vif.pwdata, vif.paddr, vif.prdata), UVM_NONE); 
155
                       end
156
                  mon_ap.write(tr);
157
                end 
158
            end
159
        join_none
160
    endtask 
161
162
endclass
163
      
164
      
165
      
166
//////////////////////scoreboard//////////////////////
167
class sco extends uvm_scoreboard;
168
`uvm_component_utils(sco)
169
170
  uvm_analysis_imp#(transaction,sco) recv;
171
  bit [7:0] arr [1024];
172
  bit [7:0] temp,check;
173
 
174
175
    function new(input string inst = "sco", uvm_component parent = null);
176
    super.new(inst,parent);
177
    endfunction
178
    
179
    virtual function void build_phase(uvm_phase phase);
180
    super.build_phase(phase);
181
    recv = new("recv", this);
182
    endfunction
183
        
184
  virtual function void write(transaction tr);
185
    
186
    if(tr.pwrite == 1'b1)
187
      begin
188
        arr[tr.paddr] = tr.pwdata;        
189
190
        `uvm_info("SCO", $sformatf("DATA Stored | Addr : %0d Data :%0d", tr.paddr, tr.pwdata), UVM_NONE)
191
      end
192
    else
193
       begin
194
         
195
         temp = arr[tr.paddr];  
196
        
197
         if( temp == tr.prdata)
198
           `uvm_info("SCO", $sformatf("Test Passed -> Addr : %0d Data :%0d", tr.paddr, temp), UVM_NONE)
199
         else
200
          `uvm_error("SCO", $sformatf("Test Failed -> Addr : %0d Data :%0d", tr.paddr, temp))
201
         
202
       end
203
       $display("----------------------------------------------------------------");           
204
      endfunction
205
endclass
206
207
         
208
         
209
//////////////////////Agent and Sequencer//////////////////////
210
class agent extends uvm_agent;
211
`uvm_component_utils(agent)
212
213
function new(input string inst = "agent", uvm_component parent = null);
214
super.new(inst,parent);
215
endfunction
216
217
 driver d;
218
 uvm_sequencer#(transaction) seqr;
219
 monitor m;
220
221
virtual function void build_phase(uvm_phase phase);
222
super.build_phase(phase);
223
   d = driver::type_id::create("d",this);
224
   m = monitor::type_id::create("m",this);
225
   seqr = uvm_sequencer#(transaction)::type_id::create("seqr", this); 
226
endfunction
227
228
virtual function void connect_phase(uvm_phase phase);
229
    super.connect_phase(phase);
230
   d.seq_item_port.connect(seqr.seq_item_export);
231
endfunction
232
233
endclass
234
         
235
         
236
//////////////////////RAL Model//////////////////////
237
238
/////////// Status Register//////////////
239
///////// s_reg Registers//////////////
240
class status_reg extends uvm_reg;
241
  `uvm_object_utils(status_reg)
242
  
243
  rand uvm_reg_field status;
244
  rand uvm_reg_field producer;
245
  rand uvm_reg_field consumer;
246
247
  function new(string name = "status_reg");
248
    super.new(name, 8, UVM_NO_COVERAGE);
249
  endfunction
250
251
  virtual function void build();
252
    status   = uvm_reg_field::type_id::create("status");
253
    producer = uvm_reg_field::type_id::create("producer");
254
    consumer = uvm_reg_field::type_id::create("consumer");
255
    
256
    status.configure(this,   1, 0, "RW", 0, 0, 1, 1, 1);
257
    producer.configure(this, 1, 1, "RW", 0, 0, 1, 1, 1);
258
    consumer.configure(this, 1, 2, "RW", 0, 0, 1, 1, 1);
259
    
260
  endfunction
261
endclass
262
263
264
//////////////////Duplicate Register//////////////
265
///////////// control register///////////////////////
266
class ctrl_d_reg extends uvm_reg;
267
  `uvm_object_utils(ctrl_d_reg)
268
  
269
  rand uvm_reg_field d_enb_field;
270
  rand uvm_reg_field d_enable_field;
271
  rand uvm_reg_field d_r_w_field;
272
  
273
  function new(string name = "ctrl_d_reg");
274
    super.new(name, 8, UVM_NO_COVERAGE);
275
  endfunction
276
277
  virtual function void build();
278
    d_enb_field     = uvm_reg_field::type_id::create("d_enb_field");
279
    d_enable_field  = uvm_reg_field::type_id::create("d_enable_field");
280
    d_r_w_field     = uvm_reg_field::type_id::create("d_r_w_field");
281
    
282
    d_enb_field.configure(this,     1, 0, "RW", 0, 0, 1, 1, 1);
283
    d_enable_field.configure(this,  1, 1, "RW", 0, 0, 1, 1, 1);
284
    d_r_w_field.configure(this,     1, 2, "RW", 0, 0, 1, 1, 1);
285
  endfunction
286
  
287
endclass
288
289
290
///////////// d_reg registers///////////////////////
291
class data_reg extends uvm_reg;
292
  `uvm_object_utils(data_reg)
293
  
294
  rand uvm_reg_field data_reg_field;
295
  
296
  function new(string name = "data_reg");
297
    super.new(name, 8, UVM_NO_COVERAGE);
298
  endfunction
299
300
  virtual function void build();
301
    data_reg_field = uvm_reg_field::type_id::create("data_reg_field");
302
    data_reg_field.configure(this, 8, 0, "RW", 0, 0, 1, 1, 1);
303
  endfunction
304
  
305
endclass
306
307
/////////////Register Block Implementation/////////////
308
/////////////Ping pong register block///////////////////
309
class ping_pong_reg_block extends uvm_reg_block;
310
  `uvm_object_utils(ping_pong_reg_block)
311
  
312
  status_reg    s_reg0;
313
  status_reg    s_reg1;
314
315
  ctrl_d_reg    control_0;
316
  data_reg      baud_rate_0;
317
  data_reg      trans_count_0;
318
  data_reg      sl_address_0;
319
320
  ctrl_d_reg    control_1;
321
  data_reg      baud_rate_1;
322
  data_reg      trans_count_1;
323
  data_reg      sl_address_1;
324
  
325
  //uvm_reg_map default_map;
326
  
327
  function new(string name = "ping_pong_reg_block");
328
    super.new(name, UVM_NO_COVERAGE);
329
  endfunction
330
331
  virtual function void build();
332
    default_map = create_map("default_map", 8'h00, 1, UVM_LITTLE_ENDIAN,0);
333
    
334
    s_reg0  = status_reg::type_id::create("s_reg0");
335
    s_reg0.build();
336
    s_reg0.configure(this);
337
    default_map.add_reg(s_reg0, 'hF0, "RW");
338
    
339
    s_reg1  = status_reg::type_id::create("s_reg1");
340
    s_reg1.build();
341
    s_reg1.configure(this);
342
    default_map.add_reg(s_reg1, 'hF1, "RW");
343
    
344
    
345
    control_0       = ctrl_d_reg::type_id::create("control_0");
346
    control_0.build();
347
    control_0.configure(this);
348
    default_map.add_reg(control_0, 'hE0, "RW");
349
    
350
    baud_rate_0     = data_reg::type_id::create("baud_rate_0");
351
    baud_rate_0.build();
352
    baud_rate_0.configure(this);
353
    default_map.add_reg(baud_rate_0, 'hE1, "RW");
354
    
355
    trans_count_0   = data_reg::type_id::create("trans_count_0");
356
    trans_count_0.build();
357
    trans_count_0.configure(this);
358
    default_map.add_reg(trans_count_0, 'hE2, "RW");
359
    
360
    sl_address_0    = data_reg::type_id::create("sl_address_0");
361
    sl_address_0.build();
362
    sl_address_0.configure(this);
363
    default_map.add_reg(sl_address_0, 'hE3, "RW");
364
    
365
    
366
    control_1       = ctrl_d_reg::type_id::create("control_1");
367
    control_1.build();
368
    control_1.configure(this);
369
    default_map.add_reg(control_1, 'hD0, "RW");
370
    
371
    baud_rate_1     = data_reg::type_id::create("baud_rate_1");
372
    baud_rate_1.build();
373
    baud_rate_1.configure(this);
374
    default_map.add_reg(baud_rate_1, 'hD1, "RW");
375
    
376
    trans_count_1   = data_reg::type_id::create("trans_count_1");
377
    trans_count_1.build();
378
    trans_count_1.configure(this);
379
    default_map.add_reg(trans_count_1, 'hD2, "RW");
380
    
381
    sl_address_1    = data_reg::type_id::create("sl_address_1");
382
    sl_address_1.build();
383
    sl_address_1.configure(this);
384
    default_map.add_reg(sl_address_1, 'hD3, "RW");
385
    
386
    lock_model();
387
  endfunction
388
endclass
389
390
         
391
         
392
         
393
//////////////////////Adapter//////////////////////
394
class top_adapter extends uvm_reg_adapter;
395
  `uvm_object_utils (top_adapter)
396
397
  function new (string name = "top_adapter");
398
      super.new (name);
399
   endfunction
400
  
401
  function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
402
    transaction tr;    
403
    tr = transaction::type_id::create("tr");
404
    
405
    tr.pwrite    = (rw.kind == UVM_WRITE) ? 1'b1 : 1'b0;
406
    tr.paddr     = rw.addr;
407
    `uvm_info("reg2bus", $sformatf("pwrite = %0d, paddr = %0d", tr.pwrite, tr.paddr), UVM_NONE)
408
    if(tr.pwrite)   tr.pwdata =rw.data;
409
    if(!tr.pwrite)  tr.prdata=rw.data;
410
    //tr.pwdata    = rw.data;
411
    return tr;
412
  endfunction
413
414
415
   
416
  function void bus2reg(uvm_sequence_item bus_item, ref uvm_reg_bus_op rw);
417
    transaction tr;
418
    
419
    assert($cast(tr, bus_item));
420
421
    rw.kind = (tr.pwrite == 1'b1) ? UVM_WRITE : UVM_READ;
422
    rw.data = (tr.pwrite == 1'b1) ? tr.pwdata : tr.prdata;
423
    //rw.data = tr.prdata;
424
    rw.addr = tr.paddr;
425
    `uvm_info("bus2reg", $sformatf("pwrite = %0d, paddr = %0d, prdata = %0d", tr.pwrite, tr.paddr, tr.prdata), UVM_NONE)
426
    //rw.data = tr.prdata;
427
    rw.status = UVM_IS_OK;
428
  endfunction
429
endclass
430
431
432
//////////////////////Environment//////////////////////
433
class env extends uvm_env;
434
  `uvm_component_utils(env)
435
  
436
  agent         agent_inst;
437
  ping_pong_reg_block   regmodel;   
438
  top_adapter   adapter_inst;
439
  
440
  uvm_reg_predictor #(transaction)  predictor_inst;
441
   
442
  sco s; 
443
  
444
  function new(string name = "env", uvm_component parent);
445
    super.new(name, parent);
446
  endfunction : new
447
448
  function void build_phase(uvm_phase phase);
449
    super.build_phase(phase);
450
    agent_inst = agent::type_id::create("agent_inst", this);
451
    s = sco::type_id::create("s", this);
452
    
453
    regmodel = ping_pong_reg_block::type_id::create("regmodel", this);
454
    regmodel.build();
455
456
   
457
    predictor_inst = uvm_reg_predictor#(transaction)::type_id::create("predictor_inst", this);
458
    adapter_inst = top_adapter::type_id::create("adapter_inst",, get_full_name());
459
    
460
  endfunction 
461
462
  function void connect_phase(uvm_phase phase);
463
    agent_inst.m.mon_ap.connect(s.recv);
464
    agent_inst.m.mon_ap.connect(predictor_inst.bus_in);
465
    
466
    regmodel.default_map.set_sequencer( .sequencer(agent_inst.seqr), .adapter(adapter_inst) );
467
    regmodel.default_map.set_base_addr(0);
468
    
469
    predictor_inst.map       = regmodel.default_map;
470
    predictor_inst.adapter   = adapter_inst;
471
  endfunction 
472
473
endclass 
474
475
//////////////////////Sequences//////////////////////
476
//////////////////Status reg sequence////////////////
477
/////Write sequence
478
class data_reg_wr extends uvm_sequence;
479
  `uvm_object_utils(data_reg_wr)
480
  ping_pong_reg_block regmodel;
481
  
482
  function new (string name = "data_reg_wr"); 
483
    super.new(name);    
484
  endfunction
485
  
486
  task body;  
487
    uvm_status_e   status;
488
    bit [7:0] wdata; 
489
    
490
    wdata = 121;
491
492
    //if (starting_phase != null)
493
      //starting_phase.raise_objection(this);
494
    
495
    regmodel.s_reg0.write(status, wdata);
496
    `uvm_info("SEQ_reg", $sformatf("//////////////Check write reg | Data reg :%0d",wdata), UVM_NONE)
497
498
    //if (starting_phase != null)
499
      //starting_phase.drop_objection(this);
500
501
  endtask
502
endclass
503
504
        
505
//////Read Sequence
506
class data_reg_rd extends uvm_sequence;
507
  `uvm_object_utils(data_reg_rd)
508
  ping_pong_reg_block regmodel;
509
  
510
  function new (string name = "data_reg_rd"); 
511
    super.new(name);    
512
  endfunction
513
  
514
  task body;  
515
    uvm_status_e   status;
516
    bit [7:0] rdata;
517
518
    //if (starting_phase != null)
519
      //starting_phase.raise_objection(this);
520
    
521
    regmodel.s_reg0.read(status, rdata);
522
    `uvm_info("SEQ_reg", $sformatf("//////////////Check read reg | Data reg :%0d",rdata), UVM_NONE)
523
524
    //if (starting_phase != null)
525
      //starting_phase.drop_objection(this);
526
527
  endtask
528
endclass
529
530
531
532
//////////////////////Test//////////////////////
533
class test extends uvm_test;
534
  `uvm_component_utils(test)
535
536
  function new(input string inst = "test", uvm_component c);
537
    super.new(inst, c);
538
  endfunction
539
540
  env e;
541
  data_reg_wr wr_seq;
542
  data_reg_rd rd_seq;
543
544
  virtual function void build_phase(uvm_phase phase);
545
    super.build_phase(phase);
546
    e = env::type_id::create("env", this);
547
    
548
    wr_seq = data_reg_wr::type_id::create("wr_seq");
549
    rd_seq = data_reg_rd::type_id::create("rd_seq");
550
    
551
  endfunction
552
553
  virtual task run_phase(uvm_phase phase);
554
    phase.raise_objection(this);
555
556
    //`uvm_info("TEST", "Starting Write Sequence", UVM_MEDIUM)
557
    wr_seq.regmodel = e.regmodel;
558
    wr_seq.start(e.agent_inst.seqr);
559
560
    //`uvm_info("TEST", "Starting Read Sequence", UVM_MEDIUM)
561
    rd_seq.regmodel = e.regmodel;
562
    rd_seq.start(e.agent_inst.seqr);
563
564
    phase.drop_objection(this);
565
    phase.phase_done.set_drain_time(this, 200);
566
  endtask
567
endclass
568
569
//////////////////////TB//////////////////////
570
module tb; 
571
  top_if vif();
572
    
573
  apb_mod dut(
574
    .paddr(vif.paddr),
575
    .pwdata(vif.pwdata),
576
    .prdata(vif.prdata),
577
    .pwrite(vif.pwrite),
578
    .psel(vif.psel),
579
    .penable(vif.penable),
580
    .presetn(vif.presetn),
581
    .pclk(vif.pclk)
582
  );
583
  
584
  initial begin
585
   vif.pclk <= 0;
586
  end
587
588
  always #10 vif.pclk = ~vif.pclk;
589
  
590
  initial begin
591
    uvm_config_db#(virtual top_if)::set(null, "*", "vif", vif);
592
    run_test("test");
593
   end
594
  
595
  initial begin
596
    $dumpfile("dump.vcd");
597
    $dumpvars;
598
  end
599
600
endmodule
601
    
94
 
1
module apb_mod #(parameter BW = 8, CSR_no = 4)(
2
    input wire pclk,                     
3
    input wire presetn,                 
4
    input wire [BW-1:0] paddr,          
5
    input wire psel,                    
6
    input wire penable,                 
7
    input wire pwrite,                  
8
    input wire [BW-1:0] pwdata,         
9
    output wire [BW-1:0] prdata        
10
);
11
    
12
    reg [BW-1:0] prdata_reg;
13
14
    reg [7:0] s_reg [1:0];                            
15
    reg [7:0] d_reg_0[3:0];                          
16
    reg [7:0] d_reg_1[3:0];                          
17
18
    always @(posedge pclk or negedge presetn) 
19
    begin
20
        if (!presetn) 
21
        begin
22
            s_reg[0][0]   <= 1;      
23
            s_reg[0][1]   <= 0;      
24
            s_reg[0][2]   <= 0;      
25
            d_reg_0[0][0] <= 0;      
26
            d_reg_1[0][0] <= 0;      
27
            prdata_reg  <= 0;
28
        end
29
        else if (psel && penable) 
30
        begin
31
            if (pwrite)  // Write operation
32
            begin
33
              $display("pwdata %0d addr %0d",pwdata,paddr);
34
                case (s_reg[0][1])
35
                    1'b0: begin
36
                        case (paddr)
37
                            8'hf0: begin s_reg[0][1] <= pwdata[0];
38
                              $display("reg data %0d",s_reg[0][1]);
39
                            end
40
                            default: begin
41
                                d_reg_0[paddr[3:0]] <= pwdata;  // Address limited to 4 bits
42
                                s_reg[0][2]    <= 1;
43
                                s_reg[0][0]    <= 0;
44
                              $display("reg data %0d",s_reg[0][1]);
45
                            end
46
                        endcase
47
                    end
48
                    1'b1: begin
49
                        case (paddr)
50
                            8'hf0: begin s_reg[0][1] <= pwdata[0];
51
                              $display("reg data %0d",s_reg[0][1]);
52
                            end
53
                            default: begin
54
                                d_reg_1[paddr[3:0]] <= pwdata;  // Address limited to 4 bits
55
                                s_reg[0][2]    <= 0;
56
                                s_reg[0][0]    <= 0;
57
                              $display("reg data %0d",s_reg[0][1]);
58
                            end
59
                        endcase
60
                    end
61
                endcase
62
            end
63
            else // Read operation
64
            begin
65
                case (paddr[7:4])
66
                    4'hf: prdata_reg <= {5'b00000, s_reg[0][2:0]};
67
                    4'he: prdata_reg <= d_reg_0[paddr[3:0]];
68
                    default: prdata_reg <= d_reg_1[paddr[3:0]];
69
                endcase
70
            end
71
        end
72
    end
73
74
    // Fix: Assign read data output correctly
75
    assign prdata = prdata_reg;
76
77
endmodule
78
79
80
81
82
//////////////////////Interface//////////////////////
83
interface top_if;
84
85
    logic   [7 : 0]    paddr;        // 8-bit
86
    logic   [7 : 0]    pwdata;       // 8-bit
87
    logic   [7 : 0]    prdata;       // 8-bit
88
    logic              pwrite;       // 1-bit
89
    logic              psel;         // 1-bit
90
    logic              penable;      // 1-bit
91
    logic              presetn;      // 1-bit
92
    logic              pclk;         // 1-bit
93
  
94
endinterface
11 views and 1 likes     
A short description will be helpful for you to remember your playground's details
 
100:0