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