tag 标签: veilog

相关博文
  • 热度 16
    2013-9-2 16:30
    1677 次阅读|
    0 个评论
      Testbench 再学习   Testbench 主要用来生成时钟激励和模拟信号提供给测试模块 然后通过 modelsim 观察模块的响应   基本结构: module test_bench   // 通常 Testbench 没有输入与输出端口   信号或变量定义声明   使用 initial  或 always 语句来产生激励波形   例化设计模块   监控和比较输出响应   endmodule     具体内容 Testbench 内容主要包括 1 ,时间单位设置 'timescale 1ns/100ps 2 ,系统时钟和复位信号的产生 方法( 1 ) always begin         #5 clk=~clk; End 方法( 2 ) initial begin mclk = 0;    while(1) #10 mclk = ~mclk; End 方法( 3 ) initial begin        Forever   #( 延时 ) CLK = ~CLK; End   复位信号 initial begin        Rst = 1;        #100;        Rst = 0;        #500;        Rst = 1;   End 或 initial begin        Rst = 1;        @(negedge CLK);   // 等待时钟下降沿        repeat (3) @(negedge CLK);    // 经过 3 个时钟下降沿        Rst = 1; end 3 ,输入信号的初始化 initial begin         clk=1'b0;         rst=1'b1;         #10         rst=1'b0;         #500         rst=1'b1; end 4 ,模拟产生出入信号,实例化待测试模块 initial begin    a_in = 1;    b_in = 3;    #200 a_in = 2;    b_in = 0;    #200 a_in = 3;    b_in = 3; end 5 ,进行仿真观察结果     注意事项 1 , 相应于被测试模块的输入激励设置为 reg 型,输出相应设置为 wire 类型,双向端口 inout 在测试中需要进行处理。     为双向端口设置中间变量 inout_reg 作为该 inout 的输出寄存, inout 口在 testbench 中要定义为 wire 型变量,然后用输出使能控制传输方向。  eg :   inout   bi_dir_port;  wire   bi_dir_port;    reg   bi_dir_port_reg;  reg bi_dir_port_oe;  assign bi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1'bz;  用 bi_dir_port_oe 控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用 inout 双向口互连。 2 ,每个 testbench 都最好包含 $stop 语句,用以指明仿真何时结束。 3 ,加载测试向量时,避免在时钟的上下沿变化,比如数据最好在时钟上升沿之前变化,这也符合建立时间的要求。 4 , initial 和 always 是同时执行的,只是 initial 只执行一次。 5 , 一般用 initial 块给信号赋初值, initial 块执行一次, always 或者 forever 表示由事件激发反复执行   实例 `timescale 1 ns/ 1 ps module ex0_vlg_tst(); // test vector input registers reg clk; reg rst_n; // wires wire led; // assign statements (if any) ex0 i1 ( // port map - connection between master ports and signals/registers .clk(clk), .led(led), .rst_n(rst_n) ); initial begin $monitor($time,"led value = %b\n",led); // 监控 led 信号的变化,如果其值发生变 化,立马打印出来 rst_n = 0;                  clk = 0;                            #1000;                              @(posedge clk);                         rst_n = 1;                            repeat(5) #1_000_000_000;   // 延时 5s $stop;                                end      always #20 clk = ~clk;   // 出生 25MHz 时钟信号 endmodule   系统任务的使用 1 ,仿真控制任务 $stop  格式 : 在 initial 中 #500 $stop $finish  格式 : 在 initial 中 #500 $finish $stop 暂停仿真后返回软件操作主窗口,将控制权交给 user $finish 终止仿真后关闭软件操作主窗口 $time 返回 64 位整型时间 未完,完整内容见附件 
相关资源
  • 所需E币: 3
    时间: 2020-1-14 19:51
    大小: 43KB
    上传者: rdg1993
    Veilog三段式状态机时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。状态机采用VerilogHDL语言编码,建议分为三个always段完成。这是为什么呢?设计FSM的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的操作和判断等写到一个模块(process、block)中。另一种是将状态转移单独写成一个模块,将状态的操作和判断等写到另一个模块中(在Verilog代码中,相当于使用两个“always”block)。其中较好的方式是后者。其原因如下。首先FSM和其他设计一样,最好使用同步时序方式设计,好处不再累述。而状态机实现后,状态转移是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。示例如下://第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器always@(posedgeclkornegedgerst_n)//异步复位if(!rst_n)curr……