Hardwarebeschrijvingstalen en verificatie
always @(*) begin
sum = sum + in;
endBovenstaande code is geschreven met de bedoeling een accumulator te maken die de ingang in blijft optellen. Welke combinatie van het probleem met deze code en de oplossing ervan is juist?
- AEr is geen probleem; er wordt een schakeling gesynthetiseerd die in bij elke verandering van in één keer bij sum optelt
- BEr ontbreekt een signaal in de sensitivity list, zodat simulatie en synthese niet overeenkomen; herschrijf het als @(in)
- CDe uitgang van de opteller wordt zonder flipflop naar zijn eigen ingang teruggevoerd, zodat de waarde nooit stabiliseert; schrijf sum <= sum + in; binnen always @(posedge clk) om eenmaal per klok op te tellen
Antwoord en toelichting tonen
Antwoord: C. De uitgang van de opteller wordt zonder flipflop naar zijn eigen ingang teruggevoerd, zodat de waarde nooit stabiliseert; schrijf sum <= sum + in; binnen always @(posedge clk) om eenmaal per klok op te tellen
always @(*) beschrijft een combinatorische schakeling, dus deze code wordt een schakeling waarin een opteller met sum als ingang zijn uitgang rechtstreeks op sum aansluit. Zonder flipflop verandert elke verandering aan de uitgang van de opteller ook zijn ingang, en de waarde blijft rondgaan zonder te stabiliseren: een combinatorische lus. Statische timinganalyse kan dit niet verwerken, en veel lint-tools en tools voor logische synthese geven waarschuwingen of fouten. Een schakeling die waarden optelt, heeft een flipflop nodig die de waarde eenmaal per stijgende klokflank bijwerkt: gebruik een non-blocking assignment binnen always @(posedge clk) en leg ook de beginwaarde vast met een reset.
Verder: nog 9 vragen over Hardwarebeschrijvingstalen en verificatie