top验证中c和sv握手

C和SV握手


一、handshake.h and handshake.c

1.handshake.h

代码如下(示例):

#ifndef _HANDSHAKE_H
#define _HANDSHAKE_H

#include <inttypes.h>
#include "stddef.h"

extern void send_flag(char *dst, long val);
extern void wait_flag(char *src, long val);

#endif

2.handshake.c

代码如下(示例):

#define DST_ADDR  0x00001000
#define SRC_ADDR  0x00001010
void send_flag( char *dst, long val)
{
  long *dst_addr;
  dst_addr = (long *)DST_ADDR;
  *dst_addr = val;//write data val to target address
}

void wait_flag(char *src, long val)
{
  volatile long tmp_data;
  long *src_addr;
  src_addr = (long *)SRC_ADDR;
  do{
    tmp_data = *src_addr; //wait data val from source target address
  }while(tmp_data != val)
}

2.test.c

代码如下(示例):

#include "handshake.h"
int main() {
  /------------/
  send_lable("SV", 909);
  wait_label("SV", 101);
  /------------/
  return 0;
}

二、handshake.sv

1.handshake.sv

代码如下(示例):

#ifndef HANDSHAKE_SV
#define HANDSHAKE_SV
`define MEM_BASE_ADDR "top_dut/sub1/ut1/mem"
`define DST_ADDR_ID   100 //0x00001000
`define SRC_ADDR_ID   101 //0x00001010

tadk sv_send_flag(string dst, int flag);
   int dst_id;
   string path, col_num, row_num;
   //dst_id = id_func(dst);
   dst_id = `DST_ADDR_ID;
   col_num = $sformatf("%0d", dst_id[3:0]);
   row_num = $sformatf("%0d", dst_id>>4);
   path = {`MEM_BASE_ADDR, '[', row_num, "]", "[", col_num, "]"};
   uvm_hdl_deposit(path, flag);
endtask

task sv_wait_flag(string src, int flag);
  int src_id;
  int act_val;
  string path, col_num, row_num;
  src_id = `SRC_ADDR_ID;
  col_num = $sformatf("%0d", dst_id[3:0]);
  row_num = $sformatf("%0d", dst_id>>4);
  path = {`MEM_BASE_ADDR, '[', row_num, "]", "[", col_num, "]"};
  while(act_val != flag) begin
    uvm_hdl_read(path, act_val);
    #1ns;
  end
endtask
//function int id_func(string which_one);
  /*--------------------*/
//endfunction
#endif
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值