Hallo.

Ik ben net begonnen met Verilog en een FPGA bordje.
Nu probeer ik een function in een apart bestand te zetten.
Net als in C je een library hebt met je functie erin.
Nu ben ik totaal nieuw in Verilog, mijn excuses voor de noob-fouten :+

De code is erg simpel, het is meer een proof-of-concept:
Main code:


module includetest
(
button,
led
);

input button;
output led;

wire button;
reg led;

`include "toggle_function.v"

always @ (1) begin
	
	led = toggle(button);
	
end

endmodule

Code in apart bestand die ik wil aanroepen:


module toggle_function();

function toggle;
input value;

begin
	if (value == 1'b0) begin
		toggle = 1'b1;
	end
		
	else if (value == 1'b1) begin
		toggle = 1'b0;
	end	
end

endfunction
endmodule	

Maar nu krijg ik met compilen de volgende error:
"Error (10839): Verilog HDL error at toggle_function.v(1): declaring nested module declarations is a SystemVerilog feature
"
Wat doe ik fout, het lijkt mij toch wel dat je een functie in een apart bestand moet kunnen zetten.
Anders krijg je een erg lange lap code na een tijd.
Ik werk met Quartus trouwens.

Rik

Ik ken nu niet veel van C en zeker niet van geneste functies in andere deel bestanden, maar is de code zo ook als je gewoon een functie opbouw in hetzelfde bestand?

Als ik de function in de main zet dan werkt het hele geintje wel.
Met deze code dus:


module includetest
(
button,
led
);

input button;
output led;

wire button;
reg led;


always @ (1) begin
	
	led = toggle(button);
	
end

function toggle;
input value;

begin
	if (value == 1'b0) begin
		toggle = 1'b1;
	end
		
	else if (value == 1'b1) begin
		toggle = 1'b0;
	end	
end

endfunction

endmodule

Ha ok. Dan weet ik het ook niet meer, het was maar een denk piste.

awel ? de compiler vertlet je exact wat er fout is.
includes werken alleen in systemverilog.

duis : zet je proect in systemverilog mode en klaar.
project- settings - compiler en vink systemverilog / verilog 2005 aan.

klaar.
en nu we toch deftig bezig zijn :


module includetest (
                     input button,
                     output reg led
                    );
 
always @(1) begin
    led <= toggle(button);
end

function toggle;
input value;
begin
	value <= !toggle 
end
endfunction

maar eigenlijk is dit ook niet juist. het zou eigenlijk moeten zijn:

if (value) toggle <= !toggle

als de ingang hoog is dan moet de flipflop omkippen.

het hangt er allemaal vanaf wat je wilt doen. nu ben je bezig 'software' te forceren op hardware. je denkpiste is verkeerd.
ik zie trouwens ook nergens een clock in jouw systeem....

eigenlijk wil je in jouw geval 'button' als clock gebruiken

always_ff @posedge(button) toggle <= !toggle;

met andere woorden : telkens er een rising edge komt op je druktoets dan kipt de 'toggle' uitgang om. je hebt nu een aan-uit knop gemaakt.

dit zal geimplementeerd worden als een D-FF met opde clock 'button' en de Q uitgang geinverteerd teruggevoerd naar de D ingang.

"Includes werken alleen in SystemVerilog". Oh.... Nooit geweten. Dan heb ik al die tijd SysVerilog gebruikt! Kan niet waar zijn.

In de include file heb je om je functie heen een module declaratie staan. Dus, je maakt een module binnen een module. Dat lijkt me niet de bedoeling.

Overigens vindt ik het erg lelijk om de include zo halverwege een module te zetten. Het moet ook mogelijk zijn om die include gewoon bovenin je file te zetten. Ik weet de syntax zo niet uit m'n hoofd, maar even googlen moet dat zo opleveren.

Ja, als ik het project in Systemverilog zet en de module weghaal in mijn functie gaat het goed.
Maar ik heb inderdaad een denkfout gemaakt, wat voornamelijk mijn bedoeling is dat ik een aantal modules maak en die met een bestand samenlink.
Een hoop gegoogle later leert dat dit kan in je toplevel module.
En een beetje gepruts later werkt het (ach, prutsen leer je van zullen we maar zeggen)

Om het af te maken de code:
Toplevel:


module includetest 
(
button1,
button2,
led1,
led2
);

input button1;
input button2;
output reg led1;
output reg led2;

    togglefunc toggle1(.value(button1), .outputled(led1));
    togglefunc toggle2(.value(button2), .outputled(led2));
 
endmodule

Tweede module:


module togglefunc
(
value,
outputled
);

input value;
output reg outputled;

always @ (1) begin

    outputled <= !value;

end
endmodule	

Dit werkt goed, de code is nog steeds een proof-of-concept en niet iets nuttigs.
De !value is er omdat de knopjes een pull-up weerstand hebben en ik wil dat wanneer een knopje ingedrukt wordt een LED aan gaat.
Een vraagje nog voor nu, ik werk nu met Quartus maar is er wellicht een fijnere IDE voor windows?
Ik snap dat compilen nog in Quartus moet maar de IDE ervan is nu niet bepaald geweldig vind ik.

Ok, maar wat je hier maakt is GEEN functie (zoals je dat in software kent). Je instantieert een blok logica. Zo'n blok kan bv een uart zijn die je 1 or meerdere malen "neerlegt". Denk hardware, je roept dus niks aan, maar je legt hardware neer en knoopt de in/uitgangen aan signalen op het nivo erboven.

Op 14 februari 2012 23:29:42 schreef Riktw:

Een vraagje nog voor nu, ik werk nu met Quartus maar is er wellicht een fijnere IDE voor windows?
Ik snap dat compilen nog in Quartus moet maar de IDE ervan is nu niet bepaald geweldig vind ik.

Altium designer dan maar ?

De beste ide is die van Aldec. Dat ding heeft autocomplete en allerhande andere dingen.

Een IDE heb je toch helemaal niet nodig! Een editor en simulator is genoeg. Gewoon code kloppen in de editor. Dan de files op compileren op de prompt van Modelsim. Vsim aanroepen en klaar ben je.
Daarna jas je het nog even door de Xilinx/Altera tools heen, dus dat is even een IDE. Even.

Een goeie code editor is wel heel handig. Bookmarks , autocomplete , correctie voor de case etc ... Semicolons toevoegen , kwestie van stomme tikvauten te verbeteren.

Als quick en dirty simulator kan je veritak gebruiken. Werkt goed. Of je gaat direct voor modelsim.
Als je een groter project hebt wil je een mdi based systeem met een treeview en cross referencing.

Vooraleer je dat in fpga blaast ga je timing closure moeten doen. En soms zelf floorplanning. Mijn drive emulator gebruikt floorplaning. De fpga zit zo vol en timing is zo krap dat de autoplacer er niet uit geraakt. Ik gebruik incremental compilation. Bepaalde blokken zijn voorgecompileerd en gemapt in specifieke gebieden. Dat is allemaal manueeel werk. Een keer gedaan hoef je er nooit meer aan te komen. En dan heb je wel een deftige ide nodig. Als ik een blok source aanklik wil ik direct kunnen zien waar die fysiek zit.

Je wilt ook eens kijken naar wat de synth produceert. Zeker als je synthesetalen aan het leren bent !
Ik vind de quartus simulator makkelijker dan modelsim. Effe wat waveforms. Tekenen en vooruit.
Een waveform modelleren is soms ook niet makkelijk. Je zult het meerdere keren moeten runnen en tweaken vooraleer het goed is.

Mijn excuses, ik bedoelde een goede editor ipv IDE.
Maar tips voor een goede editor zijn zeker welkom :)
Modelsim had ik al even mee lopen stoeien, zeker handig.
Vakantie aankomende week, kan ik lekker verder veriloggen :)

De editor in quartus is inderdaad rommel. Je kan evengoed notepad gebruiken....

Nedit (Linux)
Editra (Linux/Windows)
Crimson (windows)

Crimson is een redelijke editor maar die is niet echt content aware wanneer het op verilog aan komt.

Heel snelle simulator om bijvoorbeeld een hele hoop regressietests binnen afzienbare tijd uit te voeren: http://www.veripool.org/wiki/verilator

(niet echt als modelsim vervanging te gebruiken, meer voor batch processing van pass/fail testen)

[Bericht gewijzigd door Uranium op (11%)]

Op 17 februari 2012 19:15:16 schreef free_electron:
Crimson ...is niet echt content aware

Wat bedoel je hier met "content aware"? Crimson heeft syntax coloring, ook voor Verilog. Maar niet van die [+] knoppen waarmee je bv een module in kunt klappen. Wie dat gebruikt is me een raadsel overigens. Ik zie het nut niet, maar wie ben ik...