昨天去參加nVIDIA公司ASIC Intern的筆試,hr沒有告訴我具體地點,一開始走錯了地方,去了春曉路122弄34號4號樓,問了下才知道那裡是nVIDIA的Physical Design部門,讓我去金科路2966號,結果又走了半個多小時才找到,幸好我去的早,要不肯定遲到了,哎,我受傷未愈的腳啊。。。
下午3點準時開始,題量不大,一共6道,也不是很難,第一題是時序問題,第二題寫Verilog代碼實現同步復位和異步復位的觸發器,後面詳細說它,第三題畫狀態圖,第四題估算計算結果所需的最小位寬,第五題給條件求FIFO所需的最小長度,第六題是4個人過橋問題,所需最短的時間,很常見了,可我還是想了好一會。
現在還讓我很鬱悶的事情是,居然第二題做錯了,越想越鬱悶,這個錯誤將讓我錯失這次我很看重的機會,傷心死了。。。
我居然將同步復位的Flip-flop寫成異步復位的Flip-flop,然後你可想而知,寫異步復位的Flip-flop時我就不知道怎么寫了,寫成
assign = (!Reset) ? 0 : data_input;
我當時也很納悶,但我的確不知道應該怎么寫,我的理解中同步電路是時鐘沿觸發,異步電路是電平觸發,而平時設計中都直接用異步復位的Flip-flop,還以為那就是同步復位的Flip-flop(當然這些都是我今天查閱一本書後才知道自己錯在哪裡的)。決定在這裡完整的寫一下這兩個模組,利己利人。
// synchronous reset flip-flop
module syn_flipflop(clk, Reset, data_input, data_output);
input clk, Reset, data_input;
output reg data_output;
always @(posedge clk)
begin
if(!Reset)
data_output <= 0;
else
data_output <= data_input;
end
endmodule
//asynchronous reset flip-flop
module asyn_flipflop(clk, Reset, data_input, data_output);
input clk, Reset, data_input;
output reg data_output;
always @(posedge clk or negedge Reset)
begin
if(!Reset)
data_output <= 0;
else
data_output <= data_input;
end
endmodule