关于verilog 的assign

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于verilog 的assign相关的知识,希望对你有一定的参考价值。

以下是一个7段译码器的测试程序:
module tb_bin27seg;
reg [3:0] din;
wire [6:0] dout;
wire en=1;

bin27seg tb(din, en, dout);

assign en=1;
assign #35 en=0;
always
begin
if(din<=4'b1111)
#4 din<=din+1;

else
din<=4'b0;
end

endmodule

仿真的时候en的值是“X”,为什么?是不是assign不能用作数值赋值?困扰……
谢谢你的回答,搞吓米飞机!嗯,我是初学的,这个测试程序我自己也会改正,我不明白的是为什么assign不能这样用呢?你的程序好详细啊,应该是这行的工程师了。
请问为什么要写成这样,有什么好处?
always #4 Clk=~Clk;
always@(posedge clk)

路人花小白,我知道以上两句的意思,但不明白有什么好处?
#4 din<=din+1;这种写法是我参考过一些教程提供的例子,它们也这样写。或者always #4 clk=~clk这种产生时钟的写法更易理解吧,用时钟源去驱动下面的仿真代码。

关于问题补充:其实如果想做赋值的话,一般都会习惯性地定义一下reg型变量,然后在always语句块内直接赋值就可以了,类似于:reg a;a=1。很少有人定义wire型变量然后再赋值的,wire型一般都是在上层模块中调用下层模块的输入输出时才会定义的类型,一般都是这样。而assign命令一般都习惯性地当做连线用,比如想把一个模块的输出给另一个模块当输入,就可以assign Input=Output;
至于时钟那两句,其实那个也是习惯性的写法,一般都习惯使用时钟信号同步整个模块,而时钟信号就是从testbench文件中发出的。特别是对于大的工程,这样的设定会方便各个模块之间的同步。我可不是什么工程师,只不过是刚学了verilog一年的研究生而已,呵呵
初学者吧?你写的这个有太多不规范的地方= =
虽然assign可以这样用,不过很少有人这么写。assign相当于连线,一般它的用处是将一个变量的值不间断地赋值给另外一个,就像把这两个变量连在一起一样。
替你写了个testbench,应该还算是比较规范的,你可以参考我的改一下。如果还不行的话你把你的源代码给我我可以帮你看一下
`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:03:54 07/01/2010
// Design Name: tb_bin27seg
// Module Name: D:/Xilinx/11.1/myproject/test12/testbench.v
// Project Name: test12
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: tb_bin27seg
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:搞吓米飞机
//
// Create Date: 17:14:55 05/08/2010
// Design Name: test
// Module Name: D:/Xilinx/11.1/myproject/convolution/convolutiontest.v
// Project Name: convolution
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: convolution
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////

module test;

// Inputs
reg clk;
reg din;
reg en;

// Outputs
wire dout;

// Instantiate the Unit Under Test (UUT)
bin27seg tb(
.din(din),
.en(en),
.dout(dout));

initial begin
// Initialize Inputs
clk=0;
din=0;
en=1;

// Wait 100 ns for global reset to finish
#100;
en=0;

// Add stimulus here

end
always #4 Clk=~Clk;
always@(posedge clk)
begin
if(din<=4'b1111)
begin
din=din+1;
end
else
begin
din=0;
end

end
endmodule
参考技术A 带assign 赋值为显式连续赋值,只能在过程块之外使用,且赋值对象一般是wire型变量。 参考技术B 他说“虽然assign可以这样用,不过很少有人这么写。assign相当于连线,一般它的用处是将一个变量的值不间断地赋值给另外一个,就像把这两个变量连在一起一样。”

din=din+1;应该用din<=din+1; 吧
always #4 Clk=~Clk;
//产生一个波形,每4ns翻转一次,
always@(posedge clk)
//每次的时钟上升沿进入always语句,和你的 #4 din<=din+1;类似,只是没见过你这样的书写方法

初学,mark一下,只为了方便查找。

以上是关于关于verilog 的assign的主要内容,如果未能解决你的问题,请参考以下文章

关于verilog中 if else 的问题

关于verilog 的assign

Verilog 语言,关于状态机的困惑

Verilog 关于负数

一个关于verilog 状态机的问题程序,综合的时候出了点错误,希望各位可以帮忙解决下问题

关于Verilog中的几种赋值语句