Getting closer.

This commit is contained in:
Ross Thompson 2024-07-09 14:09:56 -05:00
parent bf69a2e1cd
commit fd170a6583

View File

@ -67,6 +67,10 @@
#define DEFAULT_IF "eno1" #define DEFAULT_IF "eno1"
FILE *VivadoPipeFP; FILE *VivadoPipeFP;
struct sockaddr_ll socket_address;
uint8_t sendbuf[BUF_SIZ];
struct ether_header *sendeh = (struct ether_header *) sendbuf;
int tx_len = 0;
typedef struct { typedef struct {
uint64_t PC; uint64_t PC;
@ -110,22 +114,22 @@ int main(int argc, char **argv){
} }
// step 1 open a pipe to vivado // step 1 open a pipe to vivado
if (( VivadoPipeFP = popen("vivado -mode tcl", "w")) == NULL){ /* if (( VivadoPipeFP = popen("vivado -mode tcl", "w")) == NULL){ */
perror("popen"); /* perror("popen"); */
exit(1); /* exit(1); */
} /* } */
fputs("open_hw_manager\n", VivadoPipeFP); /* fputs("open_hw_manager\n", VivadoPipeFP); */
fputs("connect_hw_server -url localhost:3121\n", VivadoPipeFP); /* fputs("connect_hw_server -url localhost:3121\n", VivadoPipeFP); */
fputs("current_hw_target [get_hw_targets */xilinx_tcf/Digilent/*]\n", VivadoPipeFP); /* fputs("current_hw_target [get_hw_targets *\/xilinx_tcf/Digilent/\*]\n", VivadoPipeFP); */
fputs("open_hw_target\n", VivadoPipeFP); /* fputs("open_hw_target\n", VivadoPipeFP); */
fputs("set_property PARAM.FREQUENCY 7500000 [get_hw_targets localhost:3121/xilinx_tcf/Digilent/210319B7CA87A]\n", VivadoPipeFP); /* fputs("set_property PARAM.FREQUENCY 7500000 [get_hw_targets localhost:3121/xilinx_tcf/Digilent/210319B7CA87A]\n", VivadoPipeFP); */
// *** bug these need to made relative paths. /* // *** bug these need to made relative paths. */
fputs("set_property PROBES.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.ltx} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); /* fputs("set_property PROBES.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.ltx} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); */
fputs("set_property FULL_PROBES.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.ltx} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); /* fputs("set_property FULL_PROBES.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.ltx} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); */
fputs("set_property PROGRAM.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.bit} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); /* fputs("set_property PROGRAM.FILE {/home/ross/repos/cvw/fpga/generator/WallyFPGA.runs/impl_1/fpgaTop.bit} [get_hw_devices xc7a100t_0]\n", VivadoPipeFP); */
fputs("refresh_hw_device [lindex [get_hw_devices xc7a100t_0] 0]\n", VivadoPipeFP); /* fputs("refresh_hw_device [lindex [get_hw_devices xc7a100t_0] 0]\n", VivadoPipeFP); */
fputs("[get_hw_devices xc7a100t_0] -filter {CELL_NAME=~\"u_ila_0\"}]]\n", VivadoPipeFP); /* fputs("[get_hw_devices xc7a100t_0] -filter {CELL_NAME=~\"u_ila_0\"}]]\n", VivadoPipeFP); */
int sockfd; int sockfd;
uint8_t buf[BUF_SIZ]; uint8_t buf[BUF_SIZ];
@ -147,6 +151,8 @@ int main(int argc, char **argv){
ifopts.ifr_flags |= IFF_PROMISC; ifopts.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifopts); ioctl(sockfd, SIOCSIFFLAGS, &ifopts);
printf("Here 2\n"); printf("Here 2\n");
if (ioctl(sockfd, SIOCGIFINDEX, &ifopts) < 0)
perror("SIOCGIFINDEX");
/* Allow the socket to be reused - incase connection is closed prematurely */ /* Allow the socket to be reused - incase connection is closed prematurely */
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) { if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) {
@ -168,12 +174,57 @@ int main(int argc, char **argv){
printf("Bad RVVI_API_VERSION\n"); printf("Bad RVVI_API_VERSION\n");
} }
/* Construct the Ethernet header */
memset(sendbuf, 0, BUF_SIZ);
/* Ethernet header */
sendeh->ether_shost[0] = SRC_MAC0;
sendeh->ether_shost[1] = SRC_MAC1;
sendeh->ether_shost[2] = SRC_MAC2;
sendeh->ether_shost[3] = SRC_MAC3;
sendeh->ether_shost[4] = SRC_MAC4;
sendeh->ether_shost[5] = SRC_MAC5;
sendeh->ether_dhost[0] = DEST_MAC0;
sendeh->ether_dhost[1] = DEST_MAC1;
sendeh->ether_dhost[2] = DEST_MAC2;
sendeh->ether_dhost[3] = DEST_MAC3;
sendeh->ether_dhost[4] = DEST_MAC4;
sendeh->ether_dhost[5] = DEST_MAC5;
/* Ethertype field */
//eh->ether_type = htons(ETH_P_IP);
sendeh->ether_type = htons(ETHER_TYPE);
tx_len += sizeof(struct ether_header);
/* Packet data */
sendbuf[tx_len++] = 0xde;
sendbuf[tx_len++] = 0xad;
sendbuf[tx_len++] = 0xbe;
sendbuf[tx_len++] = 0xef;
rvviRefConfigSetString(IDV_CONFIG_MODEL_VENDOR, "riscv.ovpworld.org"); rvviRefConfigSetString(IDV_CONFIG_MODEL_VENDOR, "riscv.ovpworld.org");
rvviRefConfigSetString(IDV_CONFIG_MODEL_NAME,"riscv"); rvviRefConfigSetString(IDV_CONFIG_MODEL_NAME,"riscv");
rvviRefConfigSetString(IDV_CONFIG_MODEL_VARIANT, "RV64GC"); rvviRefConfigSetString(IDV_CONFIG_MODEL_VARIANT, "RV64GC");
rvviRefConfigSetInt(IDV_CONFIG_MODEL_ADDRESS_BUS_WIDTH, 56); rvviRefConfigSetInt(IDV_CONFIG_MODEL_ADDRESS_BUS_WIDTH, 56);
rvviRefConfigSetInt(IDV_CONFIG_MAX_NET_LATENCY_RETIREMENTS, 6); rvviRefConfigSetInt(IDV_CONFIG_MAX_NET_LATENCY_RETIREMENTS, 6);
/* Index of the network device */
socket_address.sll_ifindex = ifopts.ifr_ifindex;
/* Address length*/
socket_address.sll_halen = ETH_ALEN;
/* Destination MAC */
socket_address.sll_addr[0] = DEST_MAC0;
socket_address.sll_addr[1] = DEST_MAC1;
socket_address.sll_addr[2] = DEST_MAC2;
socket_address.sll_addr[3] = DEST_MAC3;
socket_address.sll_addr[4] = DEST_MAC4;
socket_address.sll_addr[5] = DEST_MAC5;
int i;
printf("buffer: ");
for(i=0;i<tx_len;i++){
printf("%02hhx ", sendbuf[i]);
}
printf("\n");
printf("sockfd %x\n", sockfd);
// eventually we want to put the elffiles here // eventually we want to put the elffiles here
rvviRefInit(NULL); rvviRefInit(NULL);
rvviRefPcSet(0, 0x1000); rvviRefPcSet(0, 0x1000);
@ -241,7 +292,7 @@ int main(int argc, char **argv){
printf("Simulation halted due to mismatch\n"); printf("Simulation halted due to mismatch\n");
pclose(VivadoPipeFP); //pclose(VivadoPipeFP);
close(sockfd); close(sockfd);
@ -293,10 +344,10 @@ int state_compare(int hart, uint64_t Minstret){
if (result == 0) { if (result == 0) {
sprintf(buf, "MISMATCH @ instruction # %ld\n", Minstret); sprintf(buf, "MISMATCH @ instruction # %ld\n", Minstret);
idvMsgError(buf); idvMsgError(buf);
fputs("run_hw_ila [get_hw_ilas -of_objects [get_hw_devices xc7a100t_0] -filter {CELL_NAME=~\"u_ila_0\"}] -trigger_now\n", VivadoPipeFP); /* fputs("run_hw_ila [get_hw_ilas -of_objects [get_hw_devices xc7a100t_0] -filter {CELL_NAME=~\"u_ila_0\"}] -trigger_now\n", VivadoPipeFP); */
fputs("current_hw_ila_data [upload_hw_ila_data hw_ila_1]\n", VivadoPipeFP); /* fputs("current_hw_ila_data [upload_hw_ila_data hw_ila_1]\n", VivadoPipeFP); */
fputs("display_hw_ila_data [current_hw_ila_data]\n", VivadoPipeFP); /* fputs("display_hw_ila_data [current_hw_ila_data]\n", VivadoPipeFP); */
fputs("write_hw_ila_data my_hw_ila_data [current_hw_ila_data]\n", VivadoPipeFP); /* fputs("write_hw_ila_data my_hw_ila_data [current_hw_ila_data]\n", VivadoPipeFP); */
return -1; return -1;
//if (ON_MISMATCH_DUMP_STATE) dump_state(hart); //if (ON_MISMATCH_DUMP_STATE) dump_state(hart);
} }