libero Simulate - ModelSim ME (二) 语法分析

 

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

 

image

 

语法一:初始化

  初始化语句: 让变量 为 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

语法五:TASK

6.2 Verilog 任务 | 菜鸟教程

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

 

posted on 2026-04-14 15:14  所长  阅读(25)  评论(0)    收藏  举报

导航