2015-10-31 5 views
0

Я пытаюсь получить код моей системы verilog для работы с моим кодом c, но я получаю странный вывод. Мой exp_data_out должен быть результатом моего кодировщика, но вместо этого это zzzzxzzzzzxzxzz. Может ли кто-нибудь сказать мне, почему это результат?C к SystemVerilog, мой результат неправильный

C

void encoder(
      int data_in, 
      int* data_out, 
      int* parity_out 

    ) 
{ 
int i, a[10], c[4], r[14], clk[4], n, sum = 0; 
printf("%d\n", data_in); 
a[0]= data_in & 1; 
a[1]= data_in>>1 & 1; 
a[2]= data_in>>2 & 1; 
a[3]= data_in>>3 & 1; 
a[4]= data_in>>4 & 1; 
a[5]= data_in>>5 & 1; 
a[6]= data_in>>6 & 1; 
a[7]= data_in>>7 & 1; 
a[8]= data_in>>8 & 1; 
a[9]= data_in>>9 & 1; 
a[10] =data_in>>10 & 1; 
printf("%x\n", data_in&(512));  
printf("%x\n", a[0]); 
c[0]=(a[0] + a[1] + a[3] + a[4] + a[6] + a[8] + a[10])%2; 
c[1]=(a[0] + a[2] + a[3] + a[5] + a[6] + a[9] + a[10])%2; 
c[2]=(a[1] + a[2] + a[3] + a[7] + a[8] + a[9] + a[10])%2; 
c[3]=(a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + a[10])%2; 

printf("data bits after hamming code is\n"); 

for(i=10;i>=0;i--) { 
    printf("%d",a[i]&1); 
} 
printf("\n"); 
for(i=3;i>=0;i--) { 
    printf("%d",c[i]); 
} 
printf("\n"); 
*data_out = data_in; 
*parity_out = ((c[3]&1) << 3) | ((c[2]&1) << 2) | ((c[1]&1) << 1) | ((c[0]&1)); 
} 

System Verilog

import "DPI-C" context encoder= function void encoder(input int data, output logic [14:0] outData, output int parity); 


module dpi_example(); 
    parameter size = 15; 
    parameter p_size = 4; 
    logic [10:0] rtl_data_in; 
    logic [14:0] rtl_data_out; 
    logic [14:0] exp_data_out; 
    logic [p_size-1:0] parity_out; 
    bit clk;  

    initial begin 
     clk =0; 
     #80; 
     $finish; 
    end 

    always #1 clk = ~clk; 

    always @(posedge clk) begin 

     rtl_data_in = $urandom % 2048; //generate random data 
     $display("rtl_data_in: %b", rtl_data_in); 
     encoder(rtl_data_in, exp_data_out, parity_out); 

    end 

    // generate the rtl output 
    ham_enc L1(.enc_data_in(rtl_data_in), .enc_data_out(rtl_data_out)); 
    ham_dec L2(.data_in(rtl_data_out), .data_out(decoder_data_out)); 

    //compare expected data and encoder output 
    always @(negedge clk) begin 
     if (exp_data_out == rtl_data_out) begin 
      $display("%t: PASS, Input: %b, Output (EXP/RTL) (%b/%b)", $time, rtl_data_in, exp_data_out, rtl_data_out); 
     end else begin 
      $display("%t: FAIL, Input: %b, Output (EXP/RTL) (%b/%b)", $time, rtl_data_in, exp_data_out, rtl_data_out); 
     end 
    end 


endmodule 

Это выход

78: FAIL, Input: 10000010100, Output (EXP/RTL) (zzzzxzzzzzxzxzz/100000100100000) 
+1

Как участвует [VHDL] (https://en.wikipedia.org/wiki/VHDL)? – dlask

+0

Я думаю, что вижу проблему. Ваш код VHDL слишком похож на Verilog. –

+0

Это был системный код Verilog с самого начала. Это не предполагалось, что это код VHDL. – excode

ответ

3

Ваша проблема является прототипом для data_out аргумента в вашей сист Оператор mVerilog import не соответствует коду C. У вас оно объявлено как logic [14:0] в импорте и int в коде C. Он должен быть int в обоих. Поскольку выходные аргументы копируются по значению, data_out будет отбрасываться до 15 бит при назначении exp_data_out. Так как ваш код написан сейчас, у вас есть data_out как тип int, но компилятор SystemVerilog ожидает, что формат аргумента будет логическим вектором из 4 состояний, который должен быть написан, является специальной структурой.

При использовании DPI я настоятельно рекомендую хранить все аргументы C-compatible (int, char/byte, массивы или структуры этих типов). Вы получите гораздо лучшую производительность, а также столкнетесь с меньшим количеством проблем, связанных с не совместимыми с C типами на стороне C.

Если вы используете ModelSim/Квеста, вы можете скомпилировать код и сгенерировать файл заголовка C

vlog mysource.sv -dpiheader dpi.h mysource.c 

, а затем #include этот файл заголовка в вас исходном коде C. Таким образом, компилятор C даст вам ошибку, если прототипы не совпадают, а не ошибка времени выполнения, или, что еще хуже, фатальная ошибка, которую может быть очень трудно найти.