2013-08-17 1 views
0

Я ищу для реализации 32-разрядной параллельной параллельной сборки в Verilog HDL. Вот код, который я написал ...Реализация PIPO в verilog

module pipo(input_seq, answer,reset, clock); 
    input [31:0] input_seq; 
    input  reset,clock; 
    output [31:0] answer; 

    always @ (reset) 
    begin 
     if(!reset) 
      begin 
      answer[31:0]<=1'b0; 
      end 
    end 

    always @ (posedge clock) 
    begin 
     answer[31:1]<=input_seq[30:0]; 
    end 

endmodule 

Однако это приводит к следующему лог ошибок (с использованием iverilog):

pipo.v:10: error: answer['sd31:'sd0] is not a valid l-value in pipo. 
pipo.v:4:  : answer['sd31:'sd0] is declared here as wire. 
pipo.v:16: error: answer['sd31:'sd1] is not a valid l-value in pipo. 
pipo.v:4:  : answer['sd31:'sd1] is declared here as wire. 
Elaboration failed 

Какие проблемы?

+2

Вы не должны разделить логику сброса регистра и логику синхронизации регистра на отдельные блоки. У вас должен быть один блок 'always @ (posedge clock или negedge reset)'. В вашей конструкции блок синхронизации будет по-прежнему выполняться, если будет активирован синхронизм часов при сбросе, что не является правильным способом моделирования флип-флопа. – Tim

ответ

5

Вы используете answer в качестве регистра, но он объявлен как провод. Wire - это то, что соединяет две точки и, следовательно, не имеет никакой прочности. С другой стороны, reg может сохранять ценность и прочность приводов.

Изменить объявление answer на reg, и это должно помочь.

output reg [31:0] answer; 
+1

Вот рабочий код с testbench на [EDA Playground] (http://www.edaplayground.com/s/4/82) –

-1

Я рекомендую вам, чтобы, когда вы описываете комбо-логику, используйте назначение блокировки.

always @ (reset) 
    begin 
    if(!reset) 
     begin 
     answer[31:0]=1'b0; //blocking assignment 
     end 
    end 

About this block: 

always @ (posedge clock) 
    begin 
    answer[31:1]<=input_seq[30:0]; 
    end 

Вы можете исправить ошибки, сделав вывод output reg [31:0] answer и это позволит вам назначить вывод в блок всегда.