在FPGA上,而不是使用寄存器,例如;
module FooReg(output wire o_foo, input wire [1:0] i_address);
parameter FOO_MSB = 3;
reg [FOO_MSB:0] r_data = 0;
assign o_foo = r_data[FOO_MSB]; // OUTPUT HEAD OF FOO
always @(*)
begin
r_data = 0; // RESET DATA VECTOR
r_data[i_address] = 1'b1; // SET ADDRESSED ELEMENT OF VECTOR
end
endmodule // FooReg
但是有没有办法仅使用 NET 实现相同的功能?
例如;
module FooNet(output wire o_foo, input wire [1:0] i_address);
parameter FOO_MSB = 3;
wire [FOO_MSB:0] w_data = (w_data[i_address] is 1'b1) BUT REST ARE 1'b0; // <------
assign o_foo = w_data[FOO_MSB]; // OUTPUT HEAD OF FOO
endmodule // FooNet
如果答案很明显,请原谅我....但是在我的实际 verilog 中,数据可以是 256 位宽并使用 8 位或更大的地址,如果可以单独布线完成,我试图避免占用存储,并且我仍在学习使用 FPGA...(我纠正说,无论如何,这都是组合逻辑,所以无论如何都是等价的,因为我误解了"reg"的重要性,我很感激。
您没有使用/制作寄存器!
reg
关键字具有误导性。这并不意味着您创建一个或多个寄存器 如果您在 always 部分中分配给变量,则需要 'reg' 关键字。
仅当您遵循标准寄存器模板always @(posedge clk) ....
时,才能实例化寄存器。
请注意,在System Verilog中,名称wire
和reg
将替换为关键字"logic",您仍然可以使用与使用过的完全相同的语法。
我使用"//>>>"标记为您的代码添加了注释
reg [FOO_MSB:0] r_data = 0;
assign o_foo = r_data[FOO_MSB]; // OUTPUT HEAD OF FOO
//>>> The section below generates a combinatorial circuit
//>>> and as such you only get logic or wires out of this.
always @(*)
begin
//>>> No you are NOT resetting a register here
//>>> Your setting a vector (a bundle of wires) wire to all zeros
r_data = 0; // RESET REGISTER
//>>> One of the wires is not zero but one
r_data[i_address] = 1'b1; // SET REQUESTED BIT
end
endmodule // FooRegister //>>> And change the name because no registers are made here :-)
另见这篇文章