2015-11-04 2 views
-1

Я написал эту программу в Verilog, но когда я пытаюсь ее имитировать, она показывает только XXXX ... как на выходах, так и на входных переменных. Я не понимаю, что я сделал неправильно ...Программа Verilog не будет читать ввод

PS. В файле моделирования я даю, например, значение in = 16'b1101100100001111; #20;.

module hamming_decoder(
output reg [10:0] out, 
output reg [3:0] error_index, 
output reg error, 
output reg uncorrectable, 
input [16:1] in 
); 

reg y; // in case "single error", gives the position of the error bit  
reg [1:0] check; // if check[0] = 0 - no error 
       // if check[0] = 1 and check[1] = 0 => double error 
       // if check[0] = 1 and check[1] = 1 => single error 


assign error_index[0] = in[16]^in[14]^in[12]^in[10]^in[8]^in[6]^in[4]^in[2]; 
assign error_index[1] = in[15]^in[14]^in[11]^in[10]^in[7]^in[6]^in[3]^in[2]; 
assign error_index[2] = in[13]^in[12]^in[11]^in[10]^in[5]^in[4]^in[3]^in[2]; 
assign error_index[3] = in[9]^in[8]^in[7]^in[6]^in[5]^in[4]^in[3]^in[2]; 

assign check[1] = in[1]^in[2]^in[3]^in[4]^in[5]^in[6]^in[7]^in[8]^in[9]^in[10]^in[11]^in[12]^in[13]^in[14]^in[15]^in[16]; 

always @(*) 
begin 
if (error_index[0] != 0 || error_index[1] != 0 || error_index[2] != 0 || error_index[3] != 0) 
    begin 
     check[0] = 1; 
     error = 1; 
    end 

if (check[0] == 0) 
    begin 
     error = 0; 
     uncorrectable = 0; 
     out[0] = in[1]; 
     out[1] = in[2]; 
     out[2] = in[3]; 
     out[3] = in[4]; 
     out[4] = in[5]; 
     out[5] = in[6]; 
     out[6] = in[7]; 
     out[7] = in[9]; 
     out[8] = in[10]; 
     out[9] = in[11]; 
     out[10] = in[13]; 
    end 
     else if(check[1] == 0) 
       begin 
        error = 1; 
        uncorrectable = 1; 
        out[0] = in[3]; 
        out[1] = in[5]; 
        out[2] = in[6]; 
        out[3] = in[7]; 
        out[4] = in[9]; 
        out[5] = in[10]; 
        out[6] = in[11]; 
        out[7] = in[12]; 
        out[8] = in[13]; 
        out[9] = in[14]; 
        out[10] = in[15]; 
       end 
      else if (check[1] == 1 && check[0] != 0) 
         begin 
          error = 1; 
          uncorrectable = 0; 
          y = error_index[0] + error_index[1] * 2 + error_index[2] * 4 + error_index[3] * 8; 
          out[0] = in[3]; 
          out[1] = in[5]; 
          out[2] = in[6]; 
          out[3] = in[7]; 
          out[4] = in[9]; 
          out[5] = in[10]; 
          out[6] = in[11]; 
          out[7] = in[12]; 
          out[8] = in[13]; 
          out[9] = in[14]; 
          out[10] = in[15]; 
          out[y-1] = !out[y-1]; // ? 
         end 
end 

endmodule 
+1

Отправьте свой тестовый тест. – toolic

ответ

1

Это может быть проблема, связанная с подключением порта testbench. Вы уверены, что ваш экземпляр тестового стенда?

Кроме того, для обеспечения правильных входов вам необходимо иметь синхронизирующий сигнал для периодических входов, в противном случае все ваши входы будут перемещаться в дизайне при нулевом времени моделирования.

Этот образец 16'b1101100100001111 показан как входные данные с одной ошибкой. Это будет здорово, если вы покажете свою тестовую скамью.

Я смоделировал ваш код и предоставил ему тестовый стенд. Оставив логическую часть, дизайн, похоже, работает нормально. Испытательный стенд доступен here.

EDIT:

Да, ваша конструкция является комбинационной схемой. Преобразование от входа к выходу должно происходить в нулевое время моделирования. Итак, как только в происходит при 100ns, вычисляется значение out, и тест заканчивается внезапно. Просто добавьте in = 0 после задержки 20ns и альта .. !!

Я добавил ваш тест в приведенную выше ссылку EDAPlayground, просто добавил вышеупомянутую модификацию. Этот PDF об основах тестового стендового кодирования может быть полезен.

+0

Это мой файл Verilog Test Fixture: 'timescale 1ns/1ps module hamming_decoder_test; \t // Входы: \t reg [16: 1] in; \t // Выходы: \t провод [10: 0] out; \t провод [3: 0] error_index; \t ошибка провода; \t Неисправный провод; \t \t hamming_decoder UUT ( \t \t .out (уходит), \t \t .error_index (error_index), \t \t .error (ошибка), \t \t .uncorrectable (неисправимой), \t \t.in (in) \t); \t начальная начинают \t \t \t \t в = 0; \t \t # 100; \t \t \t \t in = 16'b1110101110001011; \t \t \t \t # 20; \t конец endmodule –

+0

жаль: вот файл и трафаретная печать результата показано: http://we.tl/2ty5m8VbGZ –

+0

Модифицированный мой ответ согласно вводимым ... – sharvil111

Смежные вопросы