如何在设计中强制数据而不是使用testbench

时间:2016-01-16 08:17:06

标签: verilog

大家好,我想知道是否有办法强制设计而不是使用测试平台?比如单端口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

1 个答案:

答案 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可以应用于所有类型,例如reginteger等,但不能应用于网络(强制必须用于网络)。

此外,程序性连续分配是可合成的

但是,它们很容易被滥用,因此必须使用少量。更好的选择是找出其他一些驱动逻辑。

有关详细信息,请参阅thisthis链接。虽然可以在SystemVerilog LRM IEEE 1800-2012第10.6节找到程序性连续分配。