























libero Simulate - ModelSim ME (一) 新建工程 - 所长 - 博客园
libero Simulate - ModelSim ME (二) 语法分析 - 所长 - 博客园
libero Simulate - ModelSim ME (三) 实战测试 双端口 RAM 读写
代码
/////////////////////////////////////////////////////////////////////////////////////////////////// `timescale 1ns/100ps module test_dpsram; parameter SYSCLK_PERIOD = 100;// 10MHZ reg SYSCLK; reg NSYSRESET; initial begin SYSCLK = 1'b0; NSYSRESET = 1'b0; end ////////////////////////////////////////////////////////////////////// // Reset Pulse ////////////////////////////////////////////////////////////////////// initial begin #(SYSCLK_PERIOD * 10 ) NSYSRESET = 1'b1; end ////////////////////////////////////////////////////////////////////// // Clock Driver ////////////////////////////////////////////////////////////////////// always @(SYSCLK) #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK; endmodule

初始化语句: 让变量 为 0;
initial
begin
SYSCLK = 1'b0;
NSYSRESET = 1'b0;
end
成一个连续不断、永远翻转的时钟信号。
always @(SYSCLK)
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
`timescale 1ns/100ps 定义了 仿真时间单位 1ns; 时间精度 100ps
parameter SYSCLK_PERIOD = 100;// 100ns 是一个 时钟周期, 则 产生的时钟信号是 10Mhz;
等价下面这个语句 , #50 表示 50个时间单位即 50ns 后 SYSCLK 反转一次
always #50 SYSCLK = ~SYSCLK;
#50 表示 延迟50个时钟周期单位;
//////////////////////////////////////////////////////////////////////
// Reset Pulse
//////////////////////////////////////////////////////////////////////
initial
begin
#(SYSCLK_PERIOD * 10 ) // SYSCLK_PERIOD 是一个 10Mhz 的 时钟, 1us 后 复位信号 拉高
NSYSRESET = 1'b1;
end
initial begin
// call the main task
main;
end
// Main task
task main;
begin
$display("Hello, Testbench, task main!");
end
endtask
// 变量
reg [31:0] tick_cnt;
always @(posedge SYSCLK or negedge NSYSRESET) begin
if( !NSYSRESET ) begin
tick_cnt <= 32'b0;
end else begin
if( tick_cnt == 32'd10 ) begin
tick_cnt <= 32'b0;
$display("tick_cnt = %d", tick_cnt);
end else begin
tick_cnt <= tick_cnt + 1;
end
end
end
/////////////////////////////////////////////////////////////////////////////////////////////////// // Company: <Name> // // File: test_dpsram.v // File history: // <Revision number>: <Date>: <Comments> // <Revision number>: <Date>: <Comments> // <Revision number>: <Date>: <Comments> // // Description: // // <Description here> // // Targeted device: <Family::PolarFireSoC> <Die::MPFS250T> <Package::FCVG484> // Author: <Name> // /////////////////////////////////////////////////////////////////////////////////////////////////// `timescale 1ns/100ps module test_dpsram; parameter SYSCLK_PERIOD = 100;// 10MHZ reg SYSCLK; reg NSYSRESET; initial begin SYSCLK = 1'b0; NSYSRESET = 1'b0; end ////////////////////////////////////////////////////////////////////// // Reset Pulse ////////////////////////////////////////////////////////////////////// initial begin #(SYSCLK_PERIOD * 10 ) NSYSRESET = 1'b1; end ////////////////////////////////////////////////////////////////////// // Clock Driver ////////////////////////////////////////////////////////////////////// always @(SYSCLK) begin #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK; end initial begin // call the main task main; end // Main task task main; begin $display("Hello, Testbench, task main!"); end endtask // 变量 reg [31:0] tick_cnt; always @(posedge SYSCLK or negedge NSYSRESET) begin if( !NSYSRESET ) begin tick_cnt <= 32'b0; end else begin if( tick_cnt == 32'd10 ) begin tick_cnt <= 32'b0; $display("tick_cnt = %d", SYSCLK); end else begin tick_cnt <= tick_cnt + 1; end end end endmodule
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。