|
|
#ifndef SIMULATOR_H
|
#ifndef SIMULATOR_H
|
#define SIMULATOR_H
|
#define SIMULATOR_H
|
|
|
#if (__cplusplus > 201103L) //"C++11\n";
|
#if (__cplusplus > 201103L) //"C++11\n";
|
|
|
void* operator new(std::size_t size, std::align_val_t align) {
|
void* operator new(std::size_t size, std::align_val_t align) {
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
|
auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
|
#else
|
#else
|
auto ptr = aligned_alloc(static_cast<std::size_t>(align), size);
|
auto ptr = aligned_alloc(static_cast<std::size_t>(align), size);
|
#endif
|
#endif
|
|
|
if (!ptr)
|
if (!ptr)
|
throw std::bad_alloc{};
|
throw std::bad_alloc{};
|
/*
|
/*
|
std::cout << "new: " << size << ", align: "
|
std::cout << "new: " << size << ", align: "
|
<< static_cast<std::size_t>(align)
|
<< static_cast<std::size_t>(align)
|
<< ", ptr: " << ptr << '\n';
|
<< ", ptr: " << ptr << '\n';
|
*/
|
*/
|
return ptr;
|
return ptr;
|
|
|
}
|
}
|
|
|
void operator delete(void* ptr, std::size_t size, std::align_val_t align) noexcept {
|
void operator delete(void* ptr, std::size_t size, std::align_val_t align) noexcept {
|
/*
|
/*
|
std::cout << "delete: " << size << ", align: "
|
std::cout << "delete: " << size << ", align: "
|
<< static_cast<std::size_t>(align)
|
<< static_cast<std::size_t>(align)
|
<< ", ptr : " << ptr << '\n';
|
<< ", ptr : " << ptr << '\n';
|
*/
|
*/
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
_aligned_free(ptr);
|
_aligned_free(ptr);
|
#else
|
#else
|
free(ptr);
|
free(ptr);
|
#endif
|
#endif
|
}
|
}
|
|
|
void operator delete(void* ptr, std::align_val_t align) noexcept {
|
void operator delete(void* ptr, std::align_val_t align) noexcept {
|
/* std::cout << "delete: align: "
|
/* std::cout << "delete: align: "
|
<< static_cast<std::size_t>(align)
|
<< static_cast<std::size_t>(align)
|
<< ", ptr : " << ptr << '\n';
|
<< ", ptr : " << ptr << '\n';
|
*/
|
*/
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
_aligned_free(ptr);
|
_aligned_free(ptr);
|
#else
|
#else
|
free(ptr);
|
free(ptr);
|
#endif
|
#endif
|
}
|
}
|
|
|
#endif
|
#endif
|
|
|
|
|
#define xstr(s) str(s)
|
#define xstr(s) str(s)
|
#define str(s) #s
|
#define str(s) #s
|
|
|
|
|
//traffic type
|
//traffic type
|
#define SYNTHETIC 0
|
#define SYNTHETIC 0
|
#define TASK 1
|
#define TASK 1
|
#define NETRACE 2
|
#define NETRACE 2
|
#define SYNFUL 3
|
#define SYNFUL 3
|
|
|
//injector type
|
//injector type
|
#define PCK_INJECTOR 0
|
#define PCK_INJECTOR 0
|
#define TRFC_INJECTOR 1
|
#define TRFC_INJECTOR 1
|
|
|
#define STND_DEV_EN 1
|
#define STND_DEV_EN 1
|
|
|
|
|
int TRAFFIC_TYPE=SYNTHETIC;
|
int TRAFFIC_TYPE=SYNTHETIC;
|
int ENDP_TYPE =TRFC_INJECTOR;
|
int ENDP_TYPE =TRFC_INJECTOR;
|
|
|
|
|
|
|
int get_router_num (int , int );
|
int get_router_num (int , int );
|
|
|
|
|
|
|
#define ideal_port router_top_v__DOT__router__DOT__router_is_ideal
|
#define ideal_port router_top_v__DOT__router__DOT__router_is_ideal
|
#define active_port router_top_v__DOT__router__DOT__nb_router_active
|
#define active_port router_top_v__DOT__router__DOT__nb_router_active
|
#define pck_active_port packet_injector_verilator__DOT__endp_is_active
|
#define pck_active_port packet_injector_verilator__DOT__endp_is_active
|
#define traffic_active_port traffic_gen_top__DOT__endp_is_active
|
#define traffic_active_port traffic_gen_top__DOT__endp_is_active
|
|
|
#define CHAN_SIZE sizeof(router1[0]->chan_in[0])
|
#define CHAN_SIZE sizeof(router1[0]->chan_in[0])
|
|
|
#define conect_r2r(T1,r1,p1,T2,r2,p2) \
|
#define conect_r2r(T1,r1,p1,T2,r2,p2) \
|
memcpy(&router##T1 [r1]->chan_in[p1] , &router##T2 [r2]->chan_out[p2], CHAN_SIZE )
|
memcpy(&router##T1 [r1]->chan_in[p1] , &router##T2 [r2]->chan_out[p2], CHAN_SIZE )
|
|
|
// router_is_active[get_router_num(T1,r1)] |=(( router##T1 [r1]-> ideal_port!=0) | (router##T2 [r2]-> active_port[p2]==1))
|
// router_is_active[get_router_num(T1,r1)] |=(( router##T1 [r1]-> ideal_port!=0) | (router##T2 [r2]-> active_port[p2]==1))
|
|
|
#define connect_r2gnd(T,r,p)\
|
#define connect_r2gnd(T,r,p)\
|
memset(&router##T [r]->chan_in [p],0x00,CHAN_SIZE);
|
memset(&router##T [r]->chan_in [p],0x00,CHAN_SIZE);
|
|
|
|
|
#define connect_r2e(T,r,p,e) \
|
#define connect_r2e(T,r,p,e) \
|
void * addr1, * addr2;\
|
void * addr1, * addr2;\
|
addr1=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_out : &traffic[e]->chan_out;\
|
addr1=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_out : &traffic[e]->chan_out;\
|
addr2=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_in : &traffic[e]->chan_in;\
|
addr2=(ENDP_TYPE == PCK_INJECTOR)? &pck_inj[e]->chan_in : &traffic[e]->chan_in;\
|
memcpy(&router##T [r]->chan_in[p], addr1, CHAN_SIZE );\
|
memcpy(&router##T [r]->chan_in[p], addr1, CHAN_SIZE );\
|
memcpy(addr2, &router##T [r]->chan_out[p], CHAN_SIZE )
|
memcpy(addr2, &router##T [r]->chan_out[p], CHAN_SIZE )
|
|
|
|
|
|
|
|
|
|
|
// router_is_active[get_router_num(T,r)] |= (ENDP_TYPE == PCK_INJECTOR)? \
|
// router_is_active[get_router_num(T,r)] |= (ENDP_TYPE == PCK_INJECTOR)? \
|
(( router##T [r]-> ideal_port!=0) | (pck_inj[e]->pck_active_port==1)):\
|
(( router##T [r]-> ideal_port!=0) | (pck_inj[e]->pck_active_port==1)):\
|
(( router##T [r]-> ideal_port!=0) | (traffic[e]->traffic_active_port==1))
|
(( router##T [r]-> ideal_port!=0) | (traffic[e]->traffic_active_port==1))
|
|
|
|
|
|
|
|
|
#define IS_SELF_LOOP_EN (strcmp(SELF_LOOP_EN ,"YES")==0)
|
#define IS_SELF_LOOP_EN (strcmp(SELF_LOOP_EN ,"YES")==0)
|
#define IS_UNICAST (strcmp(CAST_TYPE,"UNICAST")==0)
|
#define IS_UNICAST (strcmp(CAST_TYPE,"UNICAST")==0)
|
#define IS_MCAST_FULL (strcmp(CAST_TYPE,"MULTICAST_FULL")==0)
|
#define IS_MCAST_FULL (strcmp(CAST_TYPE,"MULTICAST_FULL")==0)
|
#define IS_MCAST_PARTIAL (strcmp(CAST_TYPE,"MULTICAST_PARTIAL")==0)
|
#define IS_MCAST_PARTIAL (strcmp(CAST_TYPE,"MULTICAST_PARTIAL")==0)
|
#define IS_BCAST_FULL (strcmp(CAST_TYPE,"BROADCAST_FULL")==0)
|
#define IS_BCAST_FULL (strcmp(CAST_TYPE,"BROADCAST_FULL")==0)
|
#define IS_BCAST_PARTIAL (strcmp(CAST_TYPE,"BROADCAST_PARTIAL")==0)
|
#define IS_BCAST_PARTIAL (strcmp(CAST_TYPE,"BROADCAST_PARTIAL")==0)
|
|
|
#include "parameter.h"
|
#include "parameter.h"
|
//alignas(64) int router_is_active [NR]={1};
|
//alignas(64) int router_is_active [NR]={1};
|
|
|
|
|
int reset,clk;
|
int reset,clk;
|
|
|
Vtraffic *traffic[NE]; // for synthetic and trace traffic pattern
|
Vtraffic *traffic[NE]; // for synthetic and trace traffic pattern
|
Vpck_inj *pck_inj[NE]; // for netrace
|
Vpck_inj *pck_inj[NE]; // for netrace
|
|
|
|
|
|
|
|
unsigned char reset_active_high=1;
|
|
|
unsigned int total_rsv_pck_num=0;
|
unsigned int total_rsv_pck_num=0;
|
unsigned int total_sent_pck_num=0;
|
unsigned int total_sent_pck_num=0;
|
unsigned int end_sim_pck_num=0;
|
unsigned int end_sim_pck_num=0;
|
unsigned int sim_end_clk_num;
|
unsigned int sim_end_clk_num;
|
unsigned long int nt_tr_list_pck=0;
|
unsigned long int nt_tr_list_pck=0;
|
int netrace_speed_up =1;
|
int netrace_speed_up =1;
|
|
|
unsigned int * rsv_size_array;
|
unsigned int * rsv_size_array;
|
int AVG_PACKET_SIZE=5;
|
int AVG_PACKET_SIZE=5;
|
int MIN_PACKET_SIZE=5;
|
int MIN_PACKET_SIZE=5;
|
int MAX_PACKET_SIZE=5;
|
int MAX_PACKET_SIZE=5;
|
|
|
|
|
unsigned int random_var[NE] = {100};
|
unsigned int random_var[NE] = {100};
|
|
|
|
|
typedef struct statistic_struct {
|
typedef struct statistic_struct {
|
unsigned int pck_num;
|
unsigned int pck_num;
|
unsigned int flit_num;
|
unsigned int flit_num;
|
unsigned int worst_latency;
|
unsigned int worst_latency;
|
unsigned int min_latency;
|
unsigned int min_latency;
|
double sum_clk_h2h;
|
double sum_clk_h2h;
|
double sum_clk_h2t;
|
double sum_clk_h2t;
|
double sum_clk_per_hop;
|
double sum_clk_per_hop;
|
#if (STND_DEV_EN)
|
#if (STND_DEV_EN)
|
double sum_clk_pow2;
|
double sum_clk_pow2;
|
#endif
|
#endif
|
|
|
} statistic_t;
|
} statistic_t;
|
|
|
|
|
typedef struct avg_st_struct {
|
typedef struct avg_st_struct {
|
double avg_latency_per_hop;
|
double avg_latency_per_hop;
|
double avg_latency_flit;
|
double avg_latency_flit;
|
double avg_latency_pck;
|
double avg_latency_pck;
|
double avg_throughput;
|
double avg_throughput;
|
double avg_pck_siz;
|
double avg_pck_siz;
|
#if (STND_DEV_EN)
|
#if (STND_DEV_EN)
|
double std_dev;
|
double std_dev;
|
#endif
|
#endif
|
|
|
} avg_st_t;
|
} avg_st_t;
|
|
|
/*
|
/*
|
typedef struct packed {
|
typedef struct packed {
|
bit flit_wr_i;
|
bit flit_wr_i;
|
bit pck_wr_i;
|
bit pck_wr_i;
|
bit flit_wr_o;
|
bit flit_wr_o;
|
bit pck_wr_o;
|
bit pck_wr_o;
|
bit flit_in_bypassed;
|
bit flit_in_bypassed;
|
logic [BYPASSw-1 : 0] bypassed_num;
|
logic [BYPASSw-1 : 0] bypassed_num;
|
} router_event_t;
|
} router_event_t;
|
|
|
localparam BYPASSw = log2(SMART_NUM);
|
localparam BYPASSw = log2(SMART_NUM);
|
*/
|
*/
|
|
|
|
|
|
|
#define BYPASS_LSB 5
|
#define BYPASS_LSB 6
|
#define FLIT_IN_WR_FLG (1<<4)
|
#define FLIT_IN_WR_FLG (1<<5)
|
#define PCK_IN_WR_FLG (1<<3)
|
#define PCK_IN_WR_FLG (1<<4)
|
#define FLIT_OUT_WR_FLG (1<<2)
|
#define FLIT_OUT_WR_FLG (1<<3)
|
#define PCK_OUT_WR_FLG (1<<1)
|
#define PCK_OUT_WR_FLG (1<<2)
|
#define FLIT_IN_BYPASSED (1<<0)
|
#define FLIT_IN_BYPASSED (1<<1)
|
|
#define ACTIVE_HIGH_RST (1<<0)
|
|
|
|
|
|
|
|
|
typedef struct router_st_struct {
|
typedef struct router_st_struct {
|
unsigned int pck_num_in;
|
unsigned int pck_num_in;
|
unsigned int flit_num_in;
|
unsigned int flit_num_in;
|
unsigned int pck_num_out;
|
unsigned int pck_num_out;
|
unsigned int flit_num_out;
|
unsigned int flit_num_out;
|
unsigned int flit_num_in_bypassed;
|
unsigned int flit_num_in_bypassed;
|
unsigned int flit_num_in_buffered;
|
unsigned int flit_num_in_buffered;
|
unsigned int bypass_counter [SMART_NUM+1 ] ;
|
unsigned int bypass_counter [SMART_NUM+1 ] ;
|
} router_st_t;
|
} router_st_t;
|
|
|
alignas(64) router_st_t router_stat [NR][MAX_P];
|
alignas(64) router_st_t router_stat [NR][MAX_P];
|
router_st_t router_stat_accum [NR];
|
router_st_t router_stat_accum [NR];
|
|
|
|
|
#if (C>1)
|
#if (C>1)
|
statistic_t sent_stat [NE][C];
|
statistic_t sent_stat [NE][C];
|
statistic_t rsvd_stat [NE][C];
|
statistic_t rsvd_stat [NE][C];
|
#else
|
#else
|
statistic_t sent_stat [NE];
|
statistic_t sent_stat [NE];
|
statistic_t rsvd_stat [NE];
|
statistic_t rsvd_stat [NE];
|
#endif
|
#endif
|
|
|
statistic_t endp_to_endp [NE][NE];
|
statistic_t endp_to_endp [NE][NE];
|
|
|
typedef struct mcast_struct {
|
typedef struct mcast_struct {
|
int ratio;
|
int ratio;
|
int min;
|
int min;
|
int max;
|
int max;
|
}mcast_t;
|
}mcast_t;
|
|
|
|
|
void update_statistic_at_ejection ( int , unsigned int, unsigned int, unsigned int, unsigned int, unsigned int ,unsigned int);
|
void update_statistic_at_ejection ( int , unsigned int, unsigned int, unsigned int, unsigned int, unsigned int ,unsigned int);
|
void update_noc_statistic ( int);
|
void update_noc_statistic ( int);
|
unsigned char pck_class_in_gen(unsigned int);
|
unsigned char pck_class_in_gen(unsigned int);
|
unsigned int pck_dst_gen_task_graph ( unsigned int, unsigned char *);
|
unsigned int pck_dst_gen_task_graph ( unsigned int, unsigned char *);
|
void print_statistic (void);
|
void print_statistic (void);
|
void print_parameter();
|
void print_parameter();
|
void reset_all_register();
|
void reset_all_register();
|
void sim_eval_all (void);
|
void sim_eval_all (void);
|
void sim_final_all (void);
|
void sim_final_all (void);
|
void traffic_clk_negedge_event(void);
|
void traffic_clk_negedge_event(void);
|
void traffic_clk_posedge_event(void);
|
void traffic_clk_posedge_event(void);
|
void connect_clk_reset_start_all(void);
|
void connect_clk_reset_start_all(void);
|
unsigned int rnd_between (unsigned int, unsigned int );
|
unsigned int rnd_between (unsigned int, unsigned int );
|
void traffic_gen_init( void );
|
void traffic_gen_init( void );
|
void pck_inj_init(int);
|
void pck_inj_init(int);
|
void traffic_gen_final_report(void);
|
void traffic_gen_final_report(void);
|
void processArgs (int, char ** );
|
void processArgs (int, char ** );
|
void task_traffic_init (char * );
|
void task_traffic_init (char * );
|
int parse_string ( char *, int *);
|
int parse_string ( char *, int *);
|
void update_pck_size(char *);
|
void update_pck_size(char *);
|
void update_custom_traffic (char *);
|
void update_custom_traffic (char *);
|
void update_hotspot(char * );
|
void update_hotspot(char * );
|
void update_mcast_traffic(char * str);
|
void update_mcast_traffic(char * str);
|
void initial_threads (void);
|
void initial_threads (void);
|
void print_statistic_new (unsigned long int);
|
void print_statistic_new (unsigned long int);
|
void allocate_rsv_pck_counters (void);
|
void allocate_rsv_pck_counters (void);
|
void update_all_router_stat(void);
|
void update_all_router_stat(void);
|
void print_router_st(void);
|
void print_router_st(void);
|
void print_endp_to_endp_st(const char *);
|
void print_endp_to_endp_st(const char *);
|
void update_traffic_injector_st (unsigned int );
|
void update_traffic_injector_st (unsigned int );
|
|
|
#include "topology_top.h"
|
#include "topology_top.h"
|
#include "traffic_task_graph.h"
|
#include "traffic_task_graph.h"
|
#include "traffic_synthetic.h"
|
#include "traffic_synthetic.h"
|
#include "netrace_lib.h"
|
#include "netrace_lib.h"
|
#include "synful_wrapper.h"
|
#include "synful_wrapper.h"
|
|
|
#define RATIO_INIT 2
|
#define RATIO_INIT 2
|
#define DISABLE -1
|
#define DISABLE -1
|
#define MY_VL_SETBIT_W(data,bit) (data[VL_BITWORD_I(bit)] |= (VL_UL(1) << VL_BITBIT_I(bit)))
|
#define MY_VL_SETBIT_W(data,bit) (data[VL_BITWORD_I(bit)] |= (VL_UL(1) << VL_BITBIT_I(bit)))
|
|
|
#define RANDOM_RANGE 1
|
#define RANDOM_RANGE 1
|
#define RANDOM_discrete 2
|
#define RANDOM_discrete 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int HOTSPOT_NUM;
|
int HOTSPOT_NUM;
|
int * class_percentage;
|
int * class_percentage;
|
char * TRAFFIC;
|
char * TRAFFIC;
|
char * netrace_file;
|
char * netrace_file;
|
char * synful_file;
|
char * synful_file;
|
unsigned char FIXED_SRC_DST_PAIR;
|
unsigned char FIXED_SRC_DST_PAIR;
|
unsigned char NEw=0;
|
unsigned char NEw=0;
|
unsigned long int main_time = 0; // Current simulation time
|
unsigned long int main_time = 0; // Current simulation time
|
unsigned int saved_time = 0;
|
unsigned int saved_time = 0;
|
|
|
unsigned int sum_clk_h2h=0;
|
unsigned int sum_clk_h2h=0;
|
unsigned int sum_clk_h2t=0;
|
unsigned int sum_clk_h2t=0;
|
double sum_clk_per_hop=0;
|
double sum_clk_per_hop=0;
|
const int CC=(C==0)? 1 : C;
|
const int CC=(C==0)? 1 : C;
|
unsigned int total_rsv_pck_num_per_class[CC]={0};
|
unsigned int total_rsv_pck_num_per_class[CC]={0};
|
unsigned int sum_clk_h2h_per_class[CC]={0};
|
unsigned int sum_clk_h2h_per_class[CC]={0};
|
unsigned int sum_clk_h2t_per_class[CC]={0};
|
unsigned int sum_clk_h2t_per_class[CC]={0};
|
double sum_clk_per_hop_per_class[CC]={0};
|
double sum_clk_per_hop_per_class[CC]={0};
|
|
|
unsigned int clk_counter,ideal_rsv_cnt;
|
unsigned int clk_counter,ideal_rsv_cnt;
|
unsigned int count_en;
|
unsigned int count_en;
|
unsigned int total_active_endp;
|
unsigned int total_active_endp;
|
char all_done=0;
|
char all_done=0;
|
unsigned int total_sent_flit_number =0;
|
unsigned int total_sent_flit_number =0;
|
unsigned int total_rsv_flit_number =0;
|
unsigned int total_rsv_flit_number =0;
|
unsigned int total_expect_rsv_flit_num =0;
|
unsigned int total_expect_rsv_flit_num =0;
|
unsigned int total_rsv_flit_number_old=0;
|
unsigned int total_rsv_flit_number_old=0;
|
int ratio=RATIO_INIT;
|
int ratio=RATIO_INIT;
|
double first_avg_latency_flit,current_avg_latency_flit;
|
double first_avg_latency_flit,current_avg_latency_flit;
|
double sc_time_stamp ();
|
double sc_time_stamp ();
|
int pow2( int );
|
int pow2( int );
|
char inject_done=0;
|
char inject_done=0;
|
char simulation_done=0;
|
char simulation_done=0;
|
char pck_size_sel=RANDOM_RANGE;
|
char pck_size_sel=RANDOM_RANGE;
|
int * discrete_size;
|
int * discrete_size;
|
int * discrete_prob;
|
int * discrete_prob;
|
int verbosity=1;
|
int verbosity=1;
|
int thread_num =1;
|
int thread_num =1;
|
|
|
|
|
mcast_t mcast;
|
mcast_t mcast;
|
|
|
|
|
|
|
#if (STND_DEV_EN)
|
#if (STND_DEV_EN)
|
//#include <math.h>
|
//#include <math.h>
|
double sqroot (double s){
|
double sqroot (double s){
|
int i;
|
int i;
|
double root = s/3;
|
double root = s/3;
|
if (s<=0) return 0;
|
if (s<=0) return 0;
|
for(i=0;i<32;i++) root = (root +s/root)/2;
|
for(i=0;i<32;i++) root = (root +s/root)/2;
|
return root;
|
return root;
|
}
|
}
|
|
|
double sum_clk_pow2=0;
|
double sum_clk_pow2=0;
|
double sum_clk_pow2_per_class[C];
|
double sum_clk_pow2_per_class[C];
|
double standard_dev( double , unsigned int, double);
|
double standard_dev( double , unsigned int, double);
|
#endif
|
#endif
|
|
|
|
|
// set data[bit] to 1
|
// set data[bit] to 1
|
#define VL_BIT_SET_I(data, bit) data |= (VL_UL(1) << VL_BITBIT_I(bit))
|
#define VL_BIT_SET_I(data, bit) data |= (VL_UL(1) << VL_BITBIT_I(bit))
|
#define VL_BIT_SET_Q(data, bit) data |= (1ULL << VL_BITBIT_Q(bit))
|
#define VL_BIT_SET_Q(data, bit) data |= (1ULL << VL_BITBIT_Q(bit))
|
#define VL_BIT_SET_E(data, bit) data |= (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_SET_E(data, bit) data |= (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_SET_W(data, bit) (data)[VL_BITWORD_E(bit)] |= (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_SET_W(data, bit) (data)[VL_BITWORD_E(bit)] |= (VL_EUL(1) << VL_BITBIT_E(bit))
|
|
|
// set data[bit] to 0
|
// set data[bit] to 0
|
#define VL_BIT_CLR_I(data, bit) data &= ~(VL_UL(1) << VL_BITBIT_I(bit))
|
#define VL_BIT_CLR_I(data, bit) data &= ~(VL_UL(1) << VL_BITBIT_I(bit))
|
#define VL_BIT_CLR_Q(data, bit) data &= ~(1ULL << VL_BITBIT_Q(bit))
|
#define VL_BIT_CLR_Q(data, bit) data &= ~(1ULL << VL_BITBIT_Q(bit))
|
#define VL_BIT_CLR_E(data, bit) data &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_CLR_E(data, bit) data &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_CLR_W(data, bit) (data)[VL_BITWORD_E(bit)] &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
|
#define VL_BIT_CLR_W(data, bit) (data)[VL_BITWORD_E(bit)] &= ~ (VL_EUL(1) << VL_BITBIT_E(bit))
|
|
|
|
|
#if (DAw<=VL_IDATASIZE)
|
#if (DAw<=VL_IDATASIZE)
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_I(data, bit)
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_I(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_I(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_I(data, bit)
|
#define DEST_ADDR_ASSIGN_RAND(data) data = rand() & ((1<<DAw) -1)
|
#define DEST_ADDR_ASSIGN_RAND(data) data = rand() & ((1<<DAw) -1)
|
#define DEST_ADDR_ASSIGN_ZERO(data) data = 0
|
#define DEST_ADDR_ASSIGN_ZERO(data) data = 0
|
#define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1<<DAw) -1)
|
#define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1<<DAw) -1)
|
#define DEST_ADDR_IS_ZERO(a,data) a= (data ==0)
|
#define DEST_ADDR_IS_ZERO(a,data) a= (data ==0)
|
#elif (DAw<=VL_QUADSIZE)
|
#elif (DAw<=VL_QUADSIZE)
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_Q(data, bit)
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_Q(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_Q(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_Q(data, bit)
|
#define DEST_ADDR_ASSIGN_RAND(data) data = (rand()&0xFFFFFFFF) | \
|
#define DEST_ADDR_ASSIGN_RAND(data) data = (rand()&0xFFFFFFFF) | \
|
(QData) (rand() & ((1ULL<<(DAw-32)) -1)) <<32
|
(QData) (rand() & ((1ULL<<(DAw-32)) -1)) <<32
|
#define DEST_ADDR_ASSIGN_ZERO(data) data = 0ULL
|
#define DEST_ADDR_ASSIGN_ZERO(data) data = 0ULL
|
#define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1ULL<<32) -1)
|
#define DEST_ADDR_ASSIGN_INT(data,val) data = val & ((1ULL<<32) -1)
|
#define DEST_ADDR_IS_ZERO(a,data) a= (data == 0ULL)
|
#define DEST_ADDR_IS_ZERO(a,data) a= (data == 0ULL)
|
#else
|
#else
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_W(data, bit)
|
#define DEST_ADDR_BIT_SET(data, bit) VL_BIT_SET_W(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_W(data, bit)
|
#define DEST_ADDR_BIT_CLR(data, bit) VL_BIT_CLR_W(data, bit)
|
#define DEST_ADDR_ASSIGN_RAND(data) \
|
#define DEST_ADDR_ASSIGN_RAND(data) \
|
for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++) (data)[n]=rand();\
|
for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++) (data)[n]=rand();\
|
(data)[VL_BITWORD_E(DAw-1)]=rand() & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1)
|
(data)[VL_BITWORD_E(DAw-1)]=rand() & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1)
|
#define DEST_ADDR_ASSIGN_ZERO(data) \
|
#define DEST_ADDR_ASSIGN_ZERO(data) \
|
for(int n=0;n<=VL_BITWORD_E(DAw-1);n++) (data)[n]= 0
|
for(int n=0;n<=VL_BITWORD_E(DAw-1);n++) (data)[n]= 0
|
#define DEST_ADDR_ASSIGN_INT(data,val) (data)[0] = val
|
#define DEST_ADDR_ASSIGN_INT(data,val) (data)[0] = val
|
|
|
#define DEST_ADDR_IS_ZERO(a,data) \
|
#define DEST_ADDR_IS_ZERO(a,data) \
|
a=1; for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++) \
|
a=1; for(int n=0;n<=VL_BITWORD_E(DAw-1)-1;n++) \
|
if (a==1) a= ((data)[n]==0);\
|
if (a==1) a= ((data)[n]==0);\
|
if (a==1) a= ((data)[VL_BITWORD_E(DAw-1)] & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1))==0
|
if (a==1) a= ((data)[VL_BITWORD_E(DAw-1)] & ((1ULL<<(VL_BITBIT_E(DAw-1)+1)) -1))==0
|
#endif
|
#endif
|
|
|
|
|
#endif
|
#endif
|
|
|