关于verilog中function和assign的用法,有个问题请教
时间:10-02
整理:3721RD
点击:
各位大虾好,最近在看王金明的《Verilog HDL程序设计教程》,里面有个关于function的用法的例题,自己有点想不通,虚心请教各位大虾,
这个例题是一个8-3编码器的模块,里面用到了function和assign,最后用 assign dout=code(din);调用function。模块程序是书上给的,然后我自己编了激励,想看看波形对不对。
因为是个8位输入的编码器,所以我的激励把8位的二进制数轮询一遍,看波形,波形是对的。但我有个问题。
function默认的返回值是reg型的,然后又有资料说assign赋值,等号两边都应该是wire型,这时若等式右边信号有变化,都会反应到等式左边去,那么这个模块中调用function的语句assign dout=code(din); code是reg型的,那code的值变化不会反应到dout上去,所以只有一个值。
那为什么实际中仿真的时候code的值变化能够反应到dout上去呢?
————————————————————————————————————————————————————————————————————-——————
以下是8-3编码器的模块程序
module code8_3(din,dout);
input[7:0] din;
output[2:0] dout;
wire[2:0] dout;
function [2:0] code;
input[7:0] din;
casex(din)
8'b0xxx_xxxx: code=3'b000;
8'b10xx_xxxx: code=3'b001;
8'b110x_xxxx: code=3'b010;
8'b1110_xxxx: code=3'b011;
8'b1111_0xxx: code=3'b100;
8'b1111_10xx: code=3'b101;
8'b1111_110x: code=3'b110;
8'b1111_1110: code=3'b111;
default: code=3'bxxx;
endcase
endfunction
assign dout=code(din);
endmodule
这个例题是一个8-3编码器的模块,里面用到了function和assign,最后用 assign dout=code(din);调用function。模块程序是书上给的,然后我自己编了激励,想看看波形对不对。
因为是个8位输入的编码器,所以我的激励把8位的二进制数轮询一遍,看波形,波形是对的。但我有个问题。
function默认的返回值是reg型的,然后又有资料说assign赋值,等号两边都应该是wire型,这时若等式右边信号有变化,都会反应到等式左边去,那么这个模块中调用function的语句assign dout=code(din); code是reg型的,那code的值变化不会反应到dout上去,所以只有一个值。
那为什么实际中仿真的时候code的值变化能够反应到dout上去呢?
————————————————————————————————————————————————————————————————————-——————
以下是8-3编码器的模块程序
module code8_3(din,dout);
input[7:0] din;
output[2:0] dout;
wire[2:0] dout;
function [2:0] code;
input[7:0] din;
casex(din)
8'b0xxx_xxxx: code=3'b000;
8'b10xx_xxxx: code=3'b001;
8'b110x_xxxx: code=3'b010;
8'b1110_xxxx: code=3'b011;
8'b1111_0xxx: code=3'b100;
8'b1111_10xx: code=3'b101;
8'b1111_110x: code=3'b110;
8'b1111_1110: code=3'b111;
default: code=3'bxxx;
endcase
endfunction
assign dout=code(din);
endmodule
code是函数,该设计调用了这个函数,所以输出当然要随着函数的输出变化了。
assign dout=code(din);
就像设计和激励一样,设计输出是reg的可是激励调用是用的是wire的。
code是函数,该设计调用了这个函数,所以输出当然要随着函数的输出变化了。
assign dout=code(din);
就像设计和激励一样,设计输出是reg的可是激励调用是用的是wire的。
"然后又有资料说assign赋值,等号两边都应该是wire型"
这种说法是错误的,等式右边的不一定要是wire型
我明白了,多谢回答
那就是说,等式右边是reg型时,它的变化也会反映到等式左边
是的
神马?
恩。支持下。function返回值为code...调用code()函数,可以在assign语句,也可以在always语句中吧。
lu guo..........
