Verilog Tijdschaalbereik
Standaard tijdschaal
Hoewel wordt verwacht dat Verilog-modules een tijdschaal hebben die vóór de module is gedefinieerd, kunnen simulators een standaardtijdschaal invoegen. De werkelijke tijdschaal die wordt toegepast op elk bereik in een door Verilog uitgewerkte hiërarchie kan worden afgedrukt met behulp van de systeemtaak $printtimescale
die het bereik als argument accepteert.
module tb;
initial begin
// Print timescale of this module
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
Zie dat hoewel er geen tijdschaalrichtlijn voor deze module is geplaatst, de simulator uiteindelijk een tijdschaalwaarde van 1ns/1ns toepast.
Simulatielogboekxcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
Standaard tijdschaalbereik
Standaard wordt een tijdschaalrichtlijn die in een bestand is geplaatst, toegepast op alle modules die de richtlijn volgen tot de definitie van een andere tijdschaalrichtlijn.
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
module alu;
endmodule
`timescale 1ns/10ps
module des;
endmodule
In het bovenstaande voorbeeld krijgen tb en alu een tijdschaal van 1ns/1ns, terwijl des een tijdschaal van 1ns/10ps krijgt vanwege de plaatsing van de richtlijn voor de moduledefinitie van des
Simulatielogboekxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Omvang tussen Verilog-bestanden
Andere bestanden kunnen in het huidige bestand worden opgenomen met een `include
richtlijn die een pre-processorrichtlijn is en ervoor zorgt dat de compiler de inhoud van het opgenomen bestand plaatst vóór de compilatie. Dit komt dus overeen met het simpelweg plakken van de volledige inhoud van het andere bestand in dit hoofdbestand.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
`include "file_alu.v"
`include "file_des.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Zie dat de resultaten precies hetzelfde zijn als in het vorige voorbeeld. alu krijgt een tijdschaal van 1ns/1ps omdat het de laatste richtlijn was die geldig bleef totdat de compiler de alu-definitie vond, ondanks het in een ander bestand te plaatsen. des krijgt een tijdschaal van 1ns/10ps omdat de richtlijn werd vervangen voordat deze werd gedefinieerd.
Simulatielogboekxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Het wisselen van bestanden kan de tijdschaal veranderen
Volgorde van opname van bestanden speelt een belangrijke rol bij het herdefiniëren van tijdschaalrichtlijnen, wat duidelijk wordt in het onderstaande voorbeeld.
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
// NOTE! Swapped order of inclusion
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
Zie dat de module alu nu een tijdschaal van 1ns/10ps krijgt.
Simulatielogboekxcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 10ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Dit is een van de redenen om een tijdschaalrichtlijn bovenaan bestanden te hebben, zodat alle modules in dat bestand de juiste tijdschaal aannemen, ongeacht de bestandsopname.
Deze benadering kan het echter moeilijk maken om te compileren met een verschillende tijdschaalprecisie (waarde volgend op de schuine stand) zonder elk bestand te wijzigen. Veel compilers en simulators bieden ook een optie om standaard tijdschaalwaarden te negeren die op alle modules worden toegepast.
Verilog