2014-11-02 9 views
-2

У меня были довольно хорошие впечатления от структурного моделирования в Verilog, но у меня почти нет других методов моделирования. Итак, любезно помогите мне. Код компилируется отлично, но при имитации он просто зависает. Ничего не произошло. Если это важно, код является модульным множителем Montgomery. Это немного выше моего академического уровня, но мне удалось понять алгоритм и написать код. Почему симуляция не запускается? Заранее большое спасибо!Код Verilog - компилируется отлично, но имитация не выполняется

module MMM42(A1,A2,B1,B2,N,S1,S2,clk); 
input clk; 
input [3:0]A1,A2,B1,B2,N; 
output [6:0]S1,S2; 
reg [3:0]a1,a2,b1,b2,n,bd1,bd2,d1,d2,w,y; 
reg [6:0]s1,s2,s11,s21,s12,s22; 
reg q,A,Ai1,Ai2,qi1,qi2,mbrfa_ctemp,bypass; 
reg temp1,temp2; 
integer i=0; 
initial 
begin 
assign q=1'h0; 
assign A=1'h0; 
assign s1=7'h0; 
assign s2=7'h0; 
assign bd1=(B1<<1)^(B2<<1); 
assign bd2=(B1<<1)&(B2<<1); 
assign d1=bd1^bd2^n; 
assign d2=bd1&bd2&n; 
assign mbrfa_ctemp=1'h0; 
assign bypass=1'h0; 
assign qi1=1'h0; 
assign qi2=1'h0; 
assign s11=7'h0; 
assign s21=7'h0; 
assign s12=7'h0; 
assign s22=7'h0; 
assign w=4'h0; 
assign y=4'h0; 
assign Ai1=1'h0; 
assign Ai2=1'h0; 
end 
always 
begin 
assign a1=A1; 
assign b1=B1; 
assign a2=A2; 
assign b2=B2; 
assign n=N; 
end 
always @(posedge clk) 
begin 
while(i<6) 
begin 

//mbrfa 
assign temp1=(a1[i]&a2[i]);//carry_i+1 
assign temp2=(a1[i+1]&a2[i+1]);//carry_i+2 
assign mbrfa_ctemp=bypass?temp1:temp2;//mux 
assign Ai1=a1[i]^a2[i]^mbrfa_ctemp;//A_i+1 
assign Ai2=a1[i+1]^a2[i+1]^temp1;//A_i+2 

//look-ahead unit 
assign qi1=s11[1];//q_i+1 
assign qi2=s21[1]^s11[2];q_i+2 
assign bypass=~(qi1|Ai1); 
assign q=bypass?qi2:qi1;//q_bar 
assign A=bypass?Ai2:Ai1;//A_bar 

//iteration variable 
i=bypass?i+2:i+1; 

//carry save adder 1 
assign s11=(s1^s2^w)>>1;//S1'[i] 
assign s21=(s1&s2&w)>>1;//S2'[i] 

//carry save adder 2 
assign s12=(s11^s21^y)>>1;//S1[i+1] 
assign s22=(s11&s21&y)>>1;S2[i+1] 

//multiplexers 3 and 4 
assign s1=bypass?(s21>>1):s21; 
assign s2=bypass?(s22>>1):s22; 

//multiplexers 1 and 2 
if((A==0)&(q==0)) 
begin 
assign w=4'h0; 
assign y=4'h0; 
end 
else if((A==0)&(q==1)) 
begin 
assign w=N; 
assign y=4'h0; 
end 
else if((A==1)&(q==0)) 
begin 
assign w=bd1; 
assign y=bd2; 
end 
else if((A==1)&(q==1)) 
begin 
assign w=d1; 
assign y=d2; 
end 
end 
end 
endmodule 
+0

Показать ваш код testbench. Вы отлаживались с помощью средства просмотра осциллограмм? Добавьте отступ в свой код. – toolic

+0

Ничего нельзя сказать о симуляции кода, если вы не добавите свой тестовый стенд. – Qiu

+0

Точный же вопрос на EE StackExchange http://electronics.stackexchange.com/questions/136907 – Greg

ответ

0
  • always begin ... end бесконечный цикл, время не будет двигаться вперед. Возможно, вы имели в виду always @* begin ... end

  • Не используйте процедурное непрерывное назначение, иначе assign заявления внутри begin - end. Я уже по причинам и возобновляемой стратегии исправил here. В некоторых случаях вам нужно отбросить ключевое слово assign, в другом строка должна быть выведена из процедурного блока.

  • while Петли, как правило, несинтезируемы. Используйте цикл for, который может быть статически развернут.