Verilog分频器代码仿真错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog分频器代码仿真错误相关的知识,希望对你有一定的参考价值。

本人刚学Verilog,看的参考书是电子工业出版社的《基于Quartus II的数字系统Verilog HDL设计实例详解》,里面有段12分频同步复位的代码,我写了个Testbench,但是仿真结果总是不定值x,根本不计数,为什么?下附代码和TB:
`timescale 1ns/1ns
module fenpinqi(div12,clk);
input clk;
output div12;
reg div12;
reg[2:0]cnt;
always @(posedge clk)
begin
if(cnt==3'b101)
begin
div12<=~div12;
cnt<=0;
end
else
begin
cnt<=cnt+1;
end
end
endmodule

`timescale 1ns/1ns;
module fenpinqi_tb;
reg clk;
wire div12;
fenpinqi u3cs(.clk(clk),.div12(div12));

initial
begin clk=0; end
always
begin
#10 clk=1; #10 clk=0;
end
endmodule

还有个问题:我之前自己写的代码,总是在声明处报错near "reg": syntax error, unexpected "reg", expecting ';' 我感觉没错,后来用ISE生成了个TB的模板跟我写的一模一样,然后把对应行代码copy过来就过编译了,为什么?(排除输入法全半角的问题)

多谢各位

你的程序的主要的问题就是:
1.你写的是时序逻辑,里面用到的reg类型的变量在正常使用之前是要初始化的,否则用modulesim仿真时会一直为红线"X"状态的。
2.写常量数字时,一定要加上宽度,如果你只写一个“1”,那么这个1就默认为是32位的,很耗资源。
3.除非你对`timescale在仿真时的冲突决策很了解,否则建议你只在Testbench中使用这个宏。

以下是我修改过的程序,我仿真过了,没问题:
module fenpinqi(
div12,
clk,
rst
);

input clk;
input rst;
output div12;
reg div12;
reg [2:0] cnt;

always @(posedge clk)
begin
if (rst == 1'b0)
begin
div12 <=1'b0;
cnt <='b0;
end
else
begin
if(cnt==3'b101)
begin
div12 <= ~div12;
cnt <= 'b0;
end
else
begin
cnt <= cnt + 1'b1;
end
end
end
endmodule

//*******************************************************
`timescale 1ns/1ns
module
fenpinqi_tb;

reg clk;
wire div12;
reg rst;

fenpinqi u3cs(
.clk(clk),
.div12(div12),
.rst(rst));
initial

begin
clk=1'b0;
rst=1'b0;

#30 rst=1'b1; end

always
begin
#10 clk=1'b1; #10 clk=1'b0;
end
endmodule
参考技术A 仿真代码太短了,多上几十个clk周期就行了

以上是关于Verilog分频器代码仿真错误的主要内容,如果未能解决你的问题,请参考以下文章

对verilog的 仿真和综合有啥区别,具体一点

求一个用verilog实现二分之一分频(是提高频率,不是降低频率)的代码

verilog分频模块设计

分频器的Verilog实现

全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程

verilog行为仿真时钟激励显示总是z