大家好,我想知道是否有办法强制设计而不是使用测试平台?比如单端口ram的verilog代码如何强制ram [地址]为1000而不是使用testbench?
module RAM(clk, rst, w, r, data, address, read, read_out);
parameter length = 4;
parameter depth = 8;
input clk, rst, r, w;
input [length-1:0] data, address;
output [length-1:0] read;
output reg[length-1:0] read_out;
reg[length-1:0] ram [depth-1:0];
assign read = ram[address];
always@(posedge clk) begin
if (!rst) begin
if(w)
ram[address] <= data;
else if (r)
read_out <= ram[address];
end
else begin
if (w)
ram[address] <= data;
end
end
endmodule
答案 0 :(得分:0)
程序性连续分配类型的语句比任何程序语句都具有优先级。这些是assign
块内的always
语句。
参考SystemVerilog LRM中的示例1800-2012第10.6节,
assign 程序性连续赋值语句应覆盖对变量的所有过程赋值。 deassign 程序语句应结束对变量的程序连续赋值。
变量的值应保持相同,直到通过过程赋值或程序连续赋值为变量赋值为止。
因此,您可以使用组合always
块来覆盖现有值:
module ram...
//...
//...
always@*
begin
//... Some logic
assign ram[address] = whatever_data
// assign ram[address] = 'h1000;
//...
deassign ram[address];
//...
end
always@ (posedge clk, negedge reset)
begin
//...
//...
// No change here.
end
endmodule
在程序块中到达行时,将创建新的连续分配过程。
assign
可以应用于所有类型,例如reg
,integer
等,但不能应用于网络(强制必须用于网络)。
此外,程序性连续分配是可合成的。
但是,它们很容易被滥用,因此必须使用少量。更好的选择是找出其他一些驱动逻辑。
有关详细信息,请参阅this和this链接。虽然可以在SystemVerilog LRM IEEE 1800-2012第10.6节找到程序性连续分配。