Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / (Verilog) Таки в чём же различие между = и <= ? / 3 сообщений из 3, страница 1 из 1
05.10.2016, 19:31
    #39321349
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Verilog) Таки в чём же различие между = и <= ?
Здравствуйте!

Верилог это не совсем программирование, конечно. хотя в некотором смысле всё-таки программирование.
думал, что различия между блокирующим и неблокирующим присваивании только в том, что все <= в одном блоке должны выполниться одновременно. соответственно, теоретически, если в блоке одно единственное присваивание, то должно быть всё равно какое использовать.

понадобилось написать умеренно развесистый дизайн который будет использовать RAM. память есть на чипе, но чтобы гонять в симуляторе модуль памяти пришлось написать свой. Вот он вместе со вспомогательным счётчиком и тестбенчем:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
module ONCHIPRAM(address, clock, data, wren, q);

    input [7:0] address;
    input clock;
    input [15:0] data;
    input wren;
    output reg [15:0] q;

    integer c;

    reg [15:0] ramblock [255:0];

    always @(posedge clock) begin
        if (wren) begin
            if (address) begin
                ramblock[address] = data;
            end
        end
        if (address) begin
            q <= ramblock[address];
        end
    end

endmodule

module counter(clk, rst, out);
    input clk;
    input rst;
    output reg [7:0] out;

    always @(posedge clk) begin
        if (rst) begin
            out <= 1'b0;
        end else begin
            out <= out + 8'b1;
        end
    end
endmodule

module test();
    reg clk;
    reg gres;
    reg wren;
    wire [7:0] address;
    wire [15:0] q;

    initial begin        
        $dumpfile("mem.vcd");
        $dumpvars(0, clk, gres, wren, address, q);
        #0 clk <= 0;
        #0 gres <= 1;
        #0 wren <= 0;
        #50 gres <= 0;
        #0 wren <= 1;
        #2500 $finish;
    end

    always begin
        #10 clk <= ~clk;
    end

    counter cnt(.clk(clk)
        , .rst(gres)
        , .out(address)
    );

    ONCHIPRAM    ram (
        .address ( address ),
        .clock ( clk ),
        .data ( {address, address} ),
        .wren ( wren ),
        .q ( q )
    );
endmodule


в таком виде он работает исправно, но в изначальной версии было написано вот так:
Код: sql
1.
ramblock[address] <= data;


и в память ничего не попадало. выход q оставался в неопределённом состоянии пожизненно.
на представленной рисунке сверху изначальный вариант, снизу исправленный.

Собственно хотел поинтересоваться у знающих людей, в чём же закавыка? в чём именно различается работа этих двух операторов в данном конкретном случае?

Симулировал икарусом.
...
Рейтинг: 0 / 0
05.10.2016, 20:34
    #39321400
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Verilog) Таки в чём же различие между = и <= ?
Sarinвсе <= в одном блоке должны выполниться одновременно.Не совсем так. Это скорее: "присваивание не обязано быть прямо сейчас".
Все что заявлено через = - должно выполняться "немедленно" и именно в том порядке как эти присвоения появляются в блоке. А все что <= должно выполняться параллельно в конце блока.

Sarinсоответственно, теоретически, если в блоке одно единственное присваивание, то должно быть всё равно какое использовать.Да.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    always @(posedge clock) begin
        if (wren) begin
            if (address) begin
                ramblock[address] = data;
            end
        end
        if (address) begin
            q <= ramblock[address];
        end
    end

Тут не совсем ошибка. Можно заранее предсказать что запись в память произойдет раньше чем чтение из нее. Но выглядит это очень опасно... Вообще, очень не рекомендуется смешивать = и <= в одном блоке. А если все-же надо, то проще разрезать такой блок на два под-блока: последовательный и параллельный.
...
Рейтинг: 0 / 0
06.10.2016, 12:41
    #39321814
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Verilog) Таки в чём же различие между = и <= ?
Спасибо!

как-то немного не очевидно было, что перед тем, как из памяти читать в неё надо записать:)

Переписал с резетом и вывод q сделал через assign

вроде нормально работает.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / (Verilog) Таки в чём же различие между = и <= ? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]